CF1982B 题解

思路:

我们直接模拟的话肯定会超时,所以考虑优化。

我们注意到每次操作 $x$ 才加 1,对于计算机来说有点太屈才了。

所以我们考虑在一次操作内将 $x$ 加到能整除 $y$,并在 $x$ 等于 1 时退出循环这样就能省去很多时间。

注意:由于我们在 $x$ 等于 1 时就退出了循环,所以要在循环外面检查一下是否有剩余。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y,k;
int K;
signed main(){
cin>>K;
while(K--){
cin>>x>>y>>k;
while(k>0&&x!=1){
if(k>=y-(x%y)){
k-=y-(x%y);
x+=y-(x%y);

while(x%y==0)x/=y;
}
else{
x+=k;
k=0;
while(x%y==0)x/=y;
break;
}
}
k%=(y-1);
x+=k;
if(x%y==0)x/=y;//防止有剩余
cout<<x<<endl;
}
return 0;
}