1617:转圈游戏
时间限制: 1000 ms 内存限制: 524288 KB
提交数: 540 通过数: 326
【题目描述】
nn
个小伙伴(编号从 0
0
到 n−1
n−1
)围坐一圈玩游戏。按照顺时针方向给 n
n
个位置编号,从 0
0
到 n−1
n−1
。最初,第 0
0
号小伙伴在第 0
0
号位置,第 1
1
号小伙伴在第 1
1
号位置,……,依此类推。
游戏规则如下:每一轮第 00
号位置上的小伙伴顺时针走到第 m
m
号位置,第 1
1
号位置小伙伴走到第 m+1
m+1
号位置,……,依此类推,第 n−m
n−m
号位置上的小伙伴走到第 0
0
号位置,第 n−m+1
n−m+1
号位置上的小伙伴走到第 1
1
号位置,……,第 n−1
n−1
号位置上的小伙伴顺时针走到第 m−1
m−1
号位置。
现在,一共进行了 10k
10k
轮,请问 x
x
号小伙伴最后走到了第几号位置。
【输入】
输入共 11
行,包含 4
4
个整数 n、m、k、x
n、m、k、x
,每两个整数之间用一个空格隔开。
【输出】
输出共 11
行,包含 1
1
个整数,表示 10
k
10k
轮后 x
x
号小伙伴所在的位置编号。
【输入样例】
10 3 4 5
【输出样例】
5
仔细观察一下就可以发现这道题其实很简单就是累加上去之后对n取模。
但是计算过程中的取模是个坑
#include<bits/stdc++.h> using namespace std; #define ll long long ll k,n,m,x; inline ll quickpow(ll a,ll b) { ll ans=1; while(b) { if(b&1LL) ans=ans*a%n; a=a*a%n; b>>=1LL; } return ans; } int main() { scanf("%lld %lld %lld %lld",&n,&m,&k,&x); printf("%lld ",(m%n*quickpow(10,k)+x)%n); return 0; }