Official

E - 青木君のいたずら/Aoki's Trick Editorial by sugarrr


条件を満たす \(k\) としてあり得るものは、\(1\) 以上 \(30\) 以下の高々 \(30\) 通りしかありません。

したがって、\(k\) を全探索することが可能です。

\(k\) を全探索した上で、条件を満たす \(k\) が存在しなければ、出力すべき値は \(-1\) となります。

この方針で実装すると、次のようになります。

C++による実装例:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll f(ll k){
    ll x=1;
    for(int i=1;i<=30;i++){
        x*=3;
        if(i==k)x++;//高橋君のk回目の操作の直後に、青木君が1を加算した
    }
    return x;
}

signed main(){
    ll n;cin>>n;
    for(int k=1;k<=30;k++){
        ll val=f(k);
        if(val==n){
            cout<<k<<endl;
            return 0;//kを出力してプログラムを終了する。
        }
    }
    cout<<-1<<endl;
    return 0;
}

なお、この問題のように値が大きくなりそうな問題では、オーバーフローに気をつける必要があります。

今回であれば、\(1 \leq k \leq 30\) の全ての \(k\) について実際にシュミレーションをしてみて(すなわち \(f(k)\) を全て出力してみて)、オーバーフローしていないことを確かめてみるのが良いでしょう。

posted:
last update: