[NOIP2013 提高组] 转圈游戏
[NOIP2013 提高组] 转圈游戏
\(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\) 号小伙伴最后走到了第几号位置。
对于 \(100\%\) 的数据,\(1 < n < {10}^6\),\(0 < m < n\),\(0 \le x \le n\),\(0 < k < {10}^9\)。
解法:
相当于 \(x\) 号小伙伴每次在圆环上向前走了 \(m\) 步,走了 \(10^k\) 步
则可以推出式子:
\(id = (x + m \times 10^k)\) \(mod\) \(n\)
代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int LOG = 50;
int n,m,k,x;
int id;
int jump[LOG];
int qpow(int num,int x){
int ans = 1,res = num;
while(x){
if(x & 1) ans = ans * res % n;
x >>= 1,res = res * res % n;
}
return ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m>>k>>x;
cout<<(x +(m * qpow(10,k)) % n) % n;
return 0;
}