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)\) で求めることができました。

実装上はオーバーフローに注意してください。

実装例(Python)

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)

実装例(C++)

#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: