原题链接:https://www.luogu.org/problem/show?pid=1965#sub
这题怎么说呢。。想通了应该就比较简单了。。
有这么一个感觉,如果题目给的输入数据特少而且输出只有一两个数,而且数据量还非常非常大,那这题保不准是要推公式了。
这题也是这样。如果说x=0,那么进行一轮后0号位的小伙伴会走到m号位,进行两轮后小伙伴会走到2m%n号位,三轮将会是3m%n。。。以此类推,第十轮的时候便是10m%n,那10^k轮之后,可以想到,应该是位于(m * 10^k) % n处。但是x不一定等于0,所以在式子前面再加一个x就好。
所以最终答案就是ans = (x + m*10^k) % n ( * )
有人会问,k有10的九次方那么大,乘方怎么可能会乘开呢?
由模数的性质(a±b) % p = ((a % p) ± b) % p,可以把 ( * )式化为 ans = (x + m*10^k % n) % n,这样,里面的乘方就可以用快速幂做。
最后输出ans即可。
参考代码:
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 int n,m,k,x; 5 int fast_pow(int a,int x,int p){ 6 int ans = 1; 7 int sum = a % p; 8 for (;x;x>>=1,sum = sum*sum%p) 9 if (x&1) 10 ans = ans*sum%p; 11 return ans; 12 } 13 int main(){ 14 cin >> n >> m >> k >> x; 15 int ans = ( x + m*fast_pow(10,k,n) % n ) % n; 16 cout << ans % n << endl; 17 return 0; 18 }