快速幂 -- cogs1437 转圈游戏

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

猜你喜欢

转载自www.cnblogs.com/kxxy/p/11772731.html