题目描述
nn 个小伙伴(编号从 00 到 n-1n−1 )围坐一圈玩游戏。按照顺时针方向给 nn 个位置编号,从 00 到 n-1n−1 。最初,第 00 号小伙伴在第 00 号位置,第 11 号小伙伴在第 11 号位置,……,依此类推。游戏规则如下:每一轮第 00 号位置上的小伙伴顺时针走到第 mm 号位置,第 11 号位置小伙伴走到第 m+1m+1 号位置,……,依此类推,第n − m号位置上的小伙伴走到第 0 号位置,第 n \sim m+1n∼m+1 号位置上的小伙伴走到第 11 号位置,……,第 n-1n−1 号位置上的小伙伴顺时针走到第 m-1m−1 号位置。
现在,一共进行了 10^k10k 轮,请问 xx 号小伙伴最后走到了第几号位置。
输入输出格式
输入格式:
共 11 行,包含 44 个整数 n,m,k,xn,m,k,x ,每两个整数之间用一个空格隔开。
输出格式:
11 个整数,表示 10^k10k 轮后 xx 号小伙伴所在的位置编号。
输入输出样例
输入样例#1:
10 3 4 5
输出样例#1:
5
题解:
原来在x位置的人,会顺时针移动m *(10^k)次,因为移动n次后会回到原来的位置
移动次数模上n就得到相对移动距离,再加上原来的位置就行了
记得过程中疯狂模,10^k用快速幂算
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<climits>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#define MAXA 10005
using namespace std;
typedef long long LL;
LL FastPow(LL a,LL b,LL MOD) {
LL Ans = 1;
while(b) {
if(b & 1)
Ans = Ans * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return Ans % MOD;
}
LL n,m,k,x;
int main() {
//freopen("circle.in","r",stdin);
//freopen("circle.out","w",stdout);
scanf("%lld %lld %lld %lld",&n,&m,&k,&x);
printf("%lld",(((m % n) * FastPow(10,k,n)) % n + x) % n);
}