おじさんの競プロ記録

自分の力で解答できた問題を振り返り、理解を深めたいです。

AtCoder Regular Contest 057 A - 2兆円

問題

問題文へ

2兆円を目指します。初日はA円です。翌日は当日から1+K*当日の所持金分増えます。

何日かかりますか?

制約

  • {0 \leqq A < 2 \times 10^12}
  • {0 \leqq K \leqq 10^6}
  • 入力はすべて整数である

考えたこと

指数関数的に増えていくので操作をシミュレートしても間に合うと思います。指数関数的の使い方が正しいか自信はありません。

ただし、Kが0の時は1ずつしか増えないので場合分けする必要がありそうです。

コード

#define _GIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(v) v.begin(), v.end()
using namespace std;
using ll = long long;


int main(void) {
  ll A, K;
  cin >> A >> K;

  ll target = 2 * 1e12;

  if (K == 0) {
    cout << target - A << endl;
    return 0;
  }

  ll ans = 0;
  while (A < target) {
    A = A + 1 + A * K;
    ++ans;
  }

  cout << ans << endl;
  
  return 0;
}

解説を読んで

とくにありません。