这道题考察的主要是通过数学对过程进行优化,而不是通过数学而得到结论(让人摸不着头脑)。
我们不需要把k次直接一次次的加,这样时间复杂度太大,那么我们现在探讨一次要加多少。
我们想要实现加一个数n,满足(x + n) % y == 0
,那么很容易知道我们需要的数n = y - (x % y)
。
那么我们就只需要每次x都加min(k,y - (x % y))
然后进行除y操作就可以了,当k的剩余次数为0或者x为1的时候我们就直接结束加法过程。
当x = 1的时候,每次加y-1次再经过除操作,就又会回到1,那么我们直接将x加上k对y-1取模就可以。
#include<bits/stdc++.h>
using namespace std;
void solve(){
int x,y,k;cin >> x >> y >> k;
//一次加好几次的,省时间
while(k && x!=1){
//(x + n)%y == 0
//==>> n = y - x%y
int now = min(k,y-(x%y));
k -= now;
x += now;
while(!(x%y))x/=y;
}
//这时候k直接对y取模
//处于k = 0,或者x = 1的状态
//x = 1的时候,我们不用慢慢加
//因为每次加y-1,都可以除一次,然后达到1
//k = 0的时候,就什么都没有
k %= (y-1);
x += k;
cout << x << endl;
}
int main(){
int T;cin >> T;
while(T--){
solve();
}
return 0;
}