題目大意:一開始你將會得到一個數
1.
2.若
保證有解,求X變成1的最小步數。
題解:容易想到一個dp,
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int dp[maxn];
int q[maxn];
int id[maxn];
int f,r;
int main(){
int T,x,k,t;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&x,&k,&t);
f = r = 0;
dp[1] = 0;
id[r] = 1;
q[r++] = dp[1];
for(int i = 2;i <= x;i++){
while(f<r&&id[f]+t<i) f++;
int v = q[f];
if(f == r) v = maxn;
dp[i] = v+1;
dp[i] = min(dp[i],(i%k==0?dp[i/k]:maxn)+1);
while(f<r && q[r-1]>= dp[i]) r--;
id[r] = i;
q[r++] = dp[i];
}
printf("%d\n",dp[x]);
}
return 0;
}