Official
D - Takahashi Unevolved Editorial by kyopro_friends
2種類の特訓方法のうち、強さの上昇量が少ない方を貪欲に選ぶのが良さそうです。実際、これは正しいです。しかし、実際にシミュレーションをしているとTLEになります。もう少し考察してみましょう。
カコモンジムに何度か通い、その後AtCoderジムに何度か通うのが最適解になります。
なぜなら、もしAtCoderジムに通ったあとにカコモンジムに通った場合、強さは \(Z\to Z+B \to AZ+AB\) と変化しますが、これは「カコモンジムに通ったあと、AtCoderジムに \(A\) 回通った」ときの強さに等しく、後者の方がより多くの経験値を得ることができるためです。
カコモンジムに通える回数は高々 \(\log_A Y \leq 64\) 回なので、カコモンジムに通う間をシミュレーションし、残りのAtCoderジムに通う回数を \(O(1)\) で求めることで、\(O(\log_A Y)\) で求めることができました。
実装上はオーバーフローに注意してください。
x,y,a,b=map(int,input().split())
ans=0
while a*x<=x+b and a*x<y:
x*=a
ans+=1
print(ans+(y-1-x)//b)
#include<iostream>
using namespace std;
int main(){
long long x,y,a,b;
cin >> x >> y >> a >> b;
long long ans=0;
while((double)a*x<=2e18 && a*x<=x+b && a*x<y){
x*=a;
ans++;
}
cout << ans+(y-1-x)/b << endl;
}
posted:
last update: