分析
看起来圈数很多很吓人的样子,其实一眼就看出来算周期就行了。
发现一轮一轮走走,要走 l c m ( n , m ) / m = n ∗ m / g c d ( n , m ) / m = n ∗ g c d ( n , m ) lcm(n,m)/m=n*m/gcd(n,m)/m=n*gcd(n,m) lcm(n,m)/m=n∗m/gcd(n,m)/m=n∗gcd(n,m) 次就回到原来的点。
所以直接用快速幂算 1 0 k 10^k 10k,然后mod 周期,就可以得到最后剩几轮要玩,然后直接模拟最后的这些过程就可以了。
上代码
感觉像ksm和gcd的模板题。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,m,k,x,round;
int gcd(int x,int y)
{
if(x%y==0) return y;
else return gcd(y,x%y);
}
ll ksm(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y&1) ans=ans*x%round;
x=x*x%round;
y>>=1;
}
return ans%round;
}
int main()
{
cin>>n>>m>>k>>x;
round=n*m/gcd(n,m)/m;
int rest=ksm(10,k);
//cout<<round<<' '<<rest<<endl;
for(int i=1;i<=rest;i++)
{
x=(x+m)%n;
}
cout<<x;
return 0;
}