题解 P1965 【转圈游戏】
看到题解都在说快速幂,有点懵圈,实际上这道题是可以不用快速幂的,看起来不用快速幂的话就必须暴力乘10并取模共1e9次,想这样:
#include<cstdio>
using namespace std;
int n,m,k,x;
int a[1000005];
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&x);
int i;a[0]=x;
for(i=1;;i++) {
x+=m;
if(x>=n) x-=n;
a[i]=x;
if(x==a[0]) break;
}
int q=1;
for(int j=1;j<=k;j++) q=q*10%i;
printf("%d",a[q]);
return 0;
}
然而这样的话复杂度是O(n+k),肯定会TLE的。但是注意到n的范围是1e6,也就是说不需要每次乘十取模,乘上1e10也是不会爆long long的。也就是说我们把时间优化到了原来的十分之一。
AC代码:
#include<cstdio>
using namespace std;
int n,m,k,x;
int a[1000005];
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&x);
long long i;a[0]=x;
for(i=1;;i++) {
x+=m;
if(x>=n) x-=n;
a[i]=x;
if(x==a[0]) break;
}
int l=k/10,r=k%10;
int q=1;
for(int j=1;j<=l;++j) q=q*10000000000%i;
for(int j=1;j<=r;++j) q=q*10%i;
printf("%d",a[q]);
return 0;
}