描述
n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏。按照顺时针方向给 n 个位置编号,从0 到 n-1。最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此类推。
游戏规则如下:每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,……,依此类推,第n − m号位置上的小伙伴走到第 0 号位置,第n-m+1 号位置上的小伙伴走到第 1 号位置,……,第 n-1 号位置上的小伙伴顺时针走到第m-1 号位置。
现在,一共进行了 10^k 轮,请问 x 号小伙伴最后走到了第几号位置。
格式
输入格式
输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。
输出格式
输出共 1 行,包含 1 个整数,表示 10^k 轮后 x 号小伙伴所在的位置编号。
样例1
样例输入1[复制]
10 3 4 5
样例输出1[复制]
5
解题报告
一拿到这道题,首先想到找规律,是一个循环,于是就想到先求出这个循环的位置序列,然后用10^k mod 一次循环的次数便是答案。但是只过了九组数据。
#include<iostream> #include<cstdio> using namespace std; int n,m,x,ci; long k; int wz[1000005]; int main() { freopen("circle.in","r",stdin); freopen("circle.out","w",stdout); cin>>n>>m>>k>>x; wz[0]=x; int b=x,t=0; do { t++; b=b+m; if (b>=n) b=b%n; wz[t]=b; }while(b!=x); int v=1; for(long i=1;i<=k;i++) { if (v==0) v=1; v=(v*10)%t; } if (v==0) cout<<wz[0]; else cout<<wz[v]; return 0; }
后来,知道要用 快速幂 就全过了。。
复习一下
#include<iostream> #include<cstdio> using namespace std; long long n,m,x; long long k; int main() { freopen("circle.in","r",stdin); freopen("circle.out","w",stdout); cin>>n>>m>>k>>x; long long t=1,tmp=10; while(k>0) //快速幂 { if(k%2)t=(t*tmp)%n; //是奇数 2^(i-1)*1 k=k>>1; tmp=(tmp*tmp)%n; //如 10^(2^2)=10^(2^1)*10^(2^1) 即tmp*tmp } x=(x+t*m)%n; cout<<x; return 0; }
掌握快速幂后,以后的幂的计算就快的多了