JZOJ 3532. 【NOIP2013提高组day1】转圈游戏
题目
Description
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 号小伙伴最后走到了第几号位置。
Input
输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。Output
输出共 1 行,包含 1 个整数,表示 10^k 轮后 x 号小伙伴所在的位置编号。Sample Input
10 3 4 5
Sample Output
5
Data Constraint
对于 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。
分析
显然答案为(x+m*10^k)%n 快速幂
代码
1 #include <iostream> 2 #include <cmath> 3 #include <algorithm> 4 #include <cstdio> 5 #define maxp 1505 6 #define maxf 205 7 8 using namespace std; 9 10 long long n,m,s,t,ans,k,x; 11 int map[maxp][maxp],dis[maxp][maxp]; 12 int into[maxf],outo[maxf],a[maxf],b[maxf]; 13 14 long long ksm(long long a,long long b) 15 { 16 long long x=a,ans=1; 17 while (b) 18 { 19 if (b&1!=0) ans*=x; 20 ans%=n; 21 x*=x; 22 x%=n; 23 b>>=1; 24 } 25 return ans%n; 26 } 27 int main() 28 { 29 scanf("%d%d%d%d",&n,&m,&k,&x); 30 // for (int i=1;i<=n;i++) 31 // { 32 // scanf("%d%d",&a[i],&b[i]); 33 // } 34 cout<<(m*ksm(10,k)+x)%n; 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 }

更多精彩