题目描述
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 号位置。
现在,一共进行了 10k10k 轮,请问 x 号小伙伴最后走到了第几号位置。
输入格式
输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。
输出格式
输出共 1 行,包含 1 个整数,表示 10k10k 轮后 x 号小伙伴所在的位置编号。
数据范围
1<n<1061<n<106,
0<m<n0<m<n,
1≤x≤n1≤x≤n,
0<k<109
样例
输入样例:
10 3 4 5
输出样例:
5
整体思路(公式加快速幂)
这题其实很简单,会个快速幂就ok啦。
讲解:我们发现题目的k的范围是k<10^9那肯定想到用快速幂啊。然后我们拿出我们可爱的笔和小本本啊哈哈哈。我们假设我们就是需要第一个人经过k轮的位置。其实只需要用我每次可以到哪个位置(m)乘经过了多少轮在对n取余就可以了(n为总人数)。最后得出来的答案就是我第一个人的位置,第x的人位置直接在第一个人位置上加x即可。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,x,ans,k;
ll chchaich(ll a,ll b)
{
ans=1%n;
for(;b;b>>=1)
{
if(b&1)ans=ans*ll(a)%n;
a=ll(a*a)%n;
}
return ans%n;
}
int main()
{
cin>>n>>m>>k>>x;
cout<<(chchaich(10,k)%n*m%n+x%n)%n;
}
补充一下,(ab)%mod=a%mod * b%mod, (a+b)%mod=(a%mod+b%mod)%mod;所以(x+m10^4)%mod=(x+m%mod*10^4%mod)%mod,最后那个x%n其实不需要%。
(x + (LL)qmi(10, k, n) * m) % n)请问下那y总的公式怎么是这样的,没有m%