·转圈游戏
题目大意:
给出一个有n个小朋友的环状序列,现在游戏开始,一轮游戏:i号小朋友向后移动m个位置(0号-n-1号)。那么进行10^k次游戏后x号小朋友在哪个位置,输出这个位置的号码。
解题思路:
一开始太天真,看到是水题,直接就模拟过去,后来才发现10^k次方真是太大宝宝承受不起啊_(:зゝ∠)_竟然忽略了真是疏忽;
之后看了一下正确答案,发现用了快速幂,把答案贴在下面:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
int n,m,k,x,e,ans;
int pow(int w,int q,int u) //快速幂
{
int r=1;
while(q>0)
{
if(q&1)
{
r=(r*w)%u;
}
w=(w*w)%u;
q>>=1;
}
return r;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&x); //读入数据
e=pow(10,k,n); //用快速幂求10的k次方除以n取余的值(10^k mod n)
e=m*e%n; //移动位置
ans=(x+e)%n; //(初始位置+移动位置)mod n即为最终位置
printf("%d\n",ans); //输出
return 0;
}