题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=vJimmkqjW
【题目描述】
思路:简单模拟,重点在于如何求这个轮数,由于k的范围过大,放在指数上更无法在规定时间内算出答案,因此用到快速幂处理,快速幂如下:
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
——摘自百度百科
大概意思就是,把一个数的指数分解,变成2的几次幂相加,用机器码(即二进制形式)表示,用位运算加快速度。
代码如下:
1 #include "iostream" 2 #include "cstdio" 3 #define ll long long 4 using namespace std; 5 int n; 6 ll pw(ll x, ll k) 7 { 8 ll ans = 1; 9 while (k) 10 { 11 if (k & 1) 12 ans = (ans * x) % n; 13 x = (x * x) % n; 14 k >>= 1; 15 } 16 return ans % n; 17 } 18 19 20 int main() 21 { 22 freopen("CircleNOIP2013.in", "r", stdin); 23 freopen("CircleNOIP2013.out", "w", stdout); 24 ll m, k, x; 25 cin >> n >> m >> k >> x; 26 cout << (x + (m * pw(10, k) % n)) % n << endl; 27 return 0; 28 }