2 solutions
-
2
快速幂 题解
一、问题
计算 a^b mod m。b 最大到 10^9。 如果直接循环 b 次:
for i in range(b): result = result * a % m,10^9 次循环直接 TLE二、核心原理:二分
幂运算有个性质:
← 算一次 ,再平方一次就行 ← 奇数的话拆一个 出来
每一步把指数对半砍, 只要砍约 30 次就到 1 了
三、算法:快速幂
把指数 b 写成二进制。例如 b = 10:
10 的二进制
所以 ^ × 只需要两个关键值: 和
四、 和 怎么得出来?
初始:
看第 位(最低位): 看第 位: ← 平方 看第 位: ← 再平方 看第 位: ← 再平方
b的二进制哪位是 1,就把当前 a 乘进答案
五、手算验证:^
b=10,二进制 1010,从低到高看:
步骤 B B最低位 A(当前值) RESULT 解释 初始 10 - 1 1 10最低位 0,不乘,a 平方 2 5最低位 1,乘入,a 平方 3 2最低位 0,不乘,a 平方 4 1- 最低位 1,乘入 最后 result = 1024,mod 1000 = 24
六、代码
a, b, m = map(int, input().split()) result = 1 a = a % m while b > 0: if b % 2 == 1: # b 的二进制最低位是 1 result = (result * a) % m a = (a * a) % m # a 平方,准备看下一位 b //= 2 # b 右移,砍掉最低位 print(result)using System; class Program { static void Main() { string[] input = Console.ReadLine().Split(); long a = long.Parse(input[0]); long b = long.Parse(input[1]); long m = long.Parse(input[2]); long result = 1; a = a % m; while (b > 0) { if (b % 2 == 1) // 二进制最低位是 1 result = (result * a) % m; a = (a * a) % m; // a 平方 b /= 2; // b 右移 } Console.WriteLine(result); } }
Information
- ID
- 6
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 2
- Tags
- # Submissions
- 15
- Accepted
- 7
- Uploaded By