题解 P1965 【转圈游戏】
挺多人是推公式然后快速幂直接求。
我也用了快速幂,但是因为本人蒟蒻,推不出公式,就用了另一个方法(呵呵)
推出从当前的
我们要进行
复杂度的话可以这么估测:
之前所推出的序列推出所用的复杂度可以用找规律的方法解出来:
周期:
周期:
可得周期长度为:
根据数据就能够知道这里的复杂度为
快速幂的复杂度是
注:此处的
上代码:
#include<cstdio>
using namespace std;
int n,m,k,x,use,a[1000001];
int f(int p){
if(p==0) return 1;
int tmp=f(p/2)%use;
tmp=(tmp*tmp)%use;
if(p%2==1) tmp=(tmp*10)%use;
return tmp;
}
int find(int n,int m){
int ans;
for(int i=1;i<=m;i++){
if(m%i==0&&n%i==0){
ans=i;
}
}
return n/ans;
}
int main(){
scanf("%d%d%d%d",&n,&m,&k,&x);
int temp=0,chan=x;
use=find(n,m);
a[temp]=x;
while(temp<=use-1){
chan=(chan+m)%n;
temp++;
a[temp]=chan;
}
int l=f(k);
printf("%d",a[l]);
return 0;
}