[快速幂][NOIP2012]转圈游戏

转圈游戏

题目描述

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