转圈游戏

原题链接: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 }

 

posted @ 2017-09-20 23:46  ShawnZhou_Aether  阅读(153)  评论(0编辑  收藏  举报