POJ1995(整数快速幂)

本文详细介绍了快速幂运算的原理及实现方法,通过具体实例展示了如何将指数运算转换为更简单的形式,进而降低计算复杂度。

http://poj.org/problem?id=1995

题意:求(A1^B1 + A2^B2 + .....Ah^Bh)%M

直接快速幂,以前对快速幂了解不深刻,今天重新学了一遍so easy

以a^b为例:如果b是偶数那么一定可以写成 (a^2 * a^2 ....)一共是b/2个,那么其实就可以写成(a*a)^(b/2),另a = a*a,b= b/2,此时还是求a^b,只不过a和b已经变了,但是没有问题,还是可以按照上面的方法在判断的,如果b是奇数的话就把a的一个给拿出来先与ans相成,然后现在a的个数就是偶数,就可以按照偶数方法在划分;

2^8 : 8是偶数,a = a* a = 2 * 2= 4,b = b / 2 = 4;也就变成了 4^4,4还是偶数,a = 4 * 4 = 16,b= b / 2 = 2,也就变成了16 ^ 2,2还是偶数再分 a= a * a = 16 * 16,b = b / 2 = 1也就变成了 (16 * 16)^ 1,此时1是奇数ans * a就结束了,

2^5:5是奇数,先把一个2拿出来与ans相乘,ans * a = ans * 2,然后就可以划分了,a = a * a = 2 * 2 = 4,b= b / 2 = 2,也就变成了 4 ^ 2,此时的2是偶数,又可以把a与a相乘,a= a * a = 4 * 4 ,b = b / 2 = 1,也就变成了16^1,此时的b为奇数ans * a = 2 * 16;

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 int a,b,M,sum;
 8 int main()
 9 {
10     int t,h;
11     scanf("%d", &t);
12     while(t--)
13     {
14         scanf("%d%d",&M,&h);
15         sum = 0;
16         while(h--)
17         {
18             scanf("%d%d", &a,&b);
19             int ans = 1;
20             while(b)
21             {
22                 if(b & 1)
23                 {
24                     ans = (ans % M) * (a % M) % M;
25                 }
26                 a = (a % M ) * (a % M) % M;
27                 b = b >> 1;
28             }
29             sum = (sum + ans) % M;
30         }
31         printf("%d\n", sum);
32     }
33 
34     return 0;
35 }
View Code

 

转载于:https://www.cnblogs.com/zhaopAC/p/5063953.html

### 关于 POJ 平台上的幂运算问题 在处理涉及幂运算的问题时,通常需要考虑以下几个方面: 1. **快速幂算法**:这是实现高效幂运算的核心方法。通过将指数分解为二进制形式并逐步平方计算基底的方式,可以显著降低时间复杂度至 \(O(\log n)\)[^1]。 2. **模运算优化**:许多问题要求对结果取模,因此可以在每一步计算过程中应用模运算,从而避免中间结果过大导致溢出或效率下降[^1]。 以下是基于上述原理的一个典型例子及其代码实现: #### 示例代码 假设我们需要验证某个数 \(p\) 是否满足 base-\(a\) 假伪素数条件(即对于非质数 \(p\) 和任意正整数 \(a\),\(a^{p} \equiv a \ (\text{mod}\ p)\) 成立),可以通过如下方式实现: ```cpp #include <iostream> using namespace std; // 快速幂函数 (带模运算) long long fast_pow(long long base, long long exp, long long mod) { long long result = 1; while (exp > 0) { if (exp % 2 == 1) { // 如果当前位是1,则累乘 result = (result * base) % mod; } base = (base * base) % mod; // 平方基数 exp /= 2; // 移动到下一位 } return result; } bool is_pseudoprime(long long a, long long p) { if (p == 1 || p == 0) return false; // 特殊情况排除 if (fast_pow(a, p, p) != a) return false; return true; } int main() { long long a, p; cin >> a >> p; if (is_pseudoprime(a, p)) { cout << "Yes" << endl; } else { cout << "No" << endl; } return 0; } ``` 此代码片段展示了如何使用快速幂算法来判断一个数是否为假伪素数,并结合了模运算以提高效率和防止数据溢出。 另外,在更复杂的场景中可能还需要引入其他高级技术,比如 Miller-Rabin 质数测试用于大规模输入下的性能提升[^2]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值