公式

B - 細胞の培養 / Cell Cultivation 解説 by physics0523


一度細胞の個数が \(T\) を超えてしまえば、もう細胞を \(T\) 個にすることはできません。
よって、以下のシミュレーションが成立します。

  • \(S \le T\) が満たされるうちは、 \(i=0,1,\dots,K\) について、以下を繰り返す。
    • \(S=T\) であれば増殖 \(i\) 回でちょうど \(T\) 個にできていることが分かる。
    • \(i \neq K\) であれば、 \(S\)\(2\) 倍する (増殖を一度行う) 。

\(K \le 100\) なのでこのシミュレーションは機能しますし、仮に \(K \le 10^9\) のような制約であっても \(1\) 個の細胞を \(60\) 回増殖させれば \(10^{18}\) 個を超えてしまうため、操作の回数が高々 \(60\) 回で十分であることが分かればこの問題に正解できます。

\(S > T\) となった状態でシミュレーションを続行してしまうと、オーバーフローしてしまう可能性があるのでご注意ください。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

using ll=long long;

int main(){
  ll S,T,K;
  cin >> S >> T >> K;
  for(ll i=0;i<=K && S<=T;i++){
    if(S==T){
      cout << i << "\n";
      return 0;
    }
    S*=2;
  }
  cout << "-1\n";
  return 0;
}

投稿日時:
最終更新: