【13NOIP提高组】转圈游戏(信息学奥赛一本通 1875)(洛谷 1965)

题目描述

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 }
原文地址:https://www.cnblogs.com/ljy-endl/p/11378850.html