转圈游戏
题目描述
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号位置。
现在,一共进行了 10k轮,请问x号小伙伴最后走到了第几号位置。
输入
输入文件名为circle.in。
输入共1行,包含 4个整数n、m、k、x,每两个整数之间用一个空格隔开。
输出
输出文件名为circle.out。
输出共1行,包含 1个整数,表示10k轮后 x号小伙伴所在的位置编号。
样例输入
10 3 4 5
样例输出
5
提示
【数据说明】
对于30%的数据,0 <k < 7;
对于80%的数据,0 < k < 107;
对于100%的数据,1 <n < 1,000,000,0 <m <n,1 ≤ x ≤ n,0 < k < 109。
解法是快速幂
ans = (x + 10 ^ k * m) mod n
代码:
1 #include<cstdio> 2 #include<cstring> 3 4 long long n, m; 5 6 long long read(){ 7 int x = 0, f = 1; 8 char ch = getchar(); 9 while (ch < '0' || ch > '9') { 10 if (ch == '-') { 11 f = -1; 12 } 13 ch = getchar(); 14 } 15 while (ch >= '0' && ch <= '9') { 16 x = x * 10 + ch - '0'; 17 ch = getchar(); 18 } 19 return x * f; 20 } 21 22 long long pow(long long a, long long b){ 23 long long res = 1; 24 while (b) { 25 if (b & 1) { 26 res = res * a % n; 27 } 28 a = a * a % n; 29 b >>= 1; 30 } 31 return res % n; 32 } 33 34 int main(){ 35 int k, x; 36 n = read(); 37 m = read(); 38 k = read(); 39 x = read(); 40 long long ans = pow(10LL, k) % n; 41 ans = ans * m % n; 42 ans = (ans + x) % n; 43 printf("%lld", ans); 44 return 0; 45 }