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: