競技プログラミング日記

主に AtCoder の記事です

第七回 アルゴリズム実技検定 E問題

 

PAST007E

問題文から, \((3^{k}+1)\cdot 3^{30-k} = n\) を満たす \(k\) を求めればよい. つまり, \(3^{30-k} = n - 3^{30}\) を満たす \(k\) を求める. \(i := 30-k\) とおいて, \(k \in [1,30]\) のとき \(i \in [0,30)\) . これは全探索可能.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  ll n, m, k, q;
  cin >> n;

  ll p = 1;
  rep(i,30){
    p *= 3;
  }

  ll x = 1;
  rep(i,30){
    ll k = 30 - i;
    if(x == n - p){ // x = 3^i
      cout << k << endl;
      return 0;
    }
    x *= 3; // rem : x *= 3 のタイミング
  }
  cout << -1 << endl;

  return 0;
}