[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;
}
posted @ 2024-09-22 19:48  wyl123ly  阅读(1)  评论(0编辑  收藏  举报