题目描述
nn 个小描述
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
限制
每个测试点1s。
提示
对于 30%的数据,0 < k < 7;
对于 80%的数据,0 < k < 10^7;
对于 100%的数据,1 < n < 1,000,000,0 < m < n,1 <= x <=n,0 < k < 10^9。
快速幂思想!!!
由题意得最后输出的答案为(10^k*m+x)%n
当然这个过程中还需要进行多次取余,特别注意一定要开long long类型
代码来啦——
1 #include<bits/stdc++.h>
2 using namespace std;
3 int n;
4 int m,k,x;
5 int read()
6 {
7 int f=1;char ch;
8 while((ch=getchar())<'0'||ch>'9')
9 if(ch=='-')f=-1;
10 int res=ch-'0';
11 while((ch=getchar())>='0'&&ch<='9')
12 res=res*10+ch-'0';
13 return res*f;
14 }
15 void write(int x)
16 {
17 if(x<0)
18 {
19 putchar('-');
20 x=-x;
21 }
22 if(x>9)write(x/10);
23 putchar(x%10+'0');
24 }
25 long long ff(int x,int k)
26 {
27 long long res=1;
28 while(k)
29 {
30 if(k%2==1)res=res*x%n;
31 x=x*x%n;
32 k=k/2;
33 }
34 return res;
35 }
36
37 int main()
38 {
39 n=read();m=read();
40 k=read();x=read();
41 long long xx=ff(10,k);
42 xx=xx*m%n;
43 xx=(xx+x)%n;
44 printf("%lld",xx);
45 return 0;
46 }