90. 64位整数乘法(快速幂思想求 a * b mod p)

博客围绕求a乘b对p取模的值展开,给出输入输出格式及数据范围示例。因直接计算a乘b会超long long最大范围,采用二进制思想,将b写成二进制形式,某位为1就加上a*(2^n)次方并取模,每次计算可由前一次*2推出,时间复杂度为logn。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接
求 a 乘 b 对 p 取模的值。

输入格式

第一行输入整数a,第二行输入整数b,第三行输入整数p。

输出格式

输出一个整数,表示a*b mod p的值。

数据范围

1≤a,b,p≤1018

输入样例:
3
4
5

输出样例:
2

题解: (采用二进制思想)
直接计算a乘b会超 long long 的最大范围,所以采用类似于快速幂的思想,把 b写成二进制形式,如果某位上为1就加上a *(2^n)次方(n与这位所在的位置),每次计算后取模就可以了

例如计算: 3*4

4的二进制 100
3*(0 * 2 ^ 0) = 0
3*(0 * 2 ^ 1) = 0
3*(1 * 2 ^ 2) = 12

观察可发现每次的可由前一次*2推出(记得取模)

时间复杂度分析:logn

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll fast_sum(ll a,ll b,ll p){
    ll res = 0;
    while(b){
        if(b & 1) res = (res + a) % p;
        b >>= 1;
        a = a * 2 % p;
    }
    return res;
}
int main(){
	ios :: sync_with_stdio(false);
	cin.tie(0);
	ll a,b,p;
	cin >> a >> b >> p;
	cout << fast_sum(a,b,p) << endl;
	return 0;
}
### 快速幂算法的实现与解释 快速幂种高效的算法,用于计算大指数下的幂运算 \( a^b \% c \),其中 \( a \) 是底数,\( b \) 是指数,而 \( c \) 则是用来取模的数。这种算法能够显著降低传统方法所需的大量重复乘法操作带来的高时间复杂度。 #### 原理说明 对于任意两个整数 \( a \) 和 \( b \),以及个正整数 \( p \),存在如下性质: \[ (a * b) \% p = ((a \% p) * (b \% p)) \% p \] 这特性允许我们将原本复杂的乘法转换成更简单的形式来进行处理[^3]。当应用于快速幂时,则意味着可以在每步都对当前的结果进行取模操作,从而防止溢出并保持较小的数据范围。 #### 算法流程 通过二进制拆分的方式将指数分解为若干个2的幂之和的形式,进而利用平方倍增的思想逐步累乘得到最终结果。具体来说就是如果遇到奇数方就额外多单独相乘的操作;如果是偶数则只需要不断自乘即可完成整个过程。 以下是Python语言中的快速幂函数实现方式: ```python def fast_pow_mod(a, b, m): res = 1 while b > 0: if b & 1: # 当前是否为1 res = (res * a) % m a = (a * a) % m b >>= 1 # 右移相当于除以2 return res ``` 此代码片段展示了如何有效地执行带有取余操作的大规模幂运算,在实际编程竞赛或者工程实践中非常有用。 #### 应用场景 除了基本的数学计算外,快速幂还广泛应用于密码学领域内的公钥加密体制中,比如RSA算法就需要频繁地做类似的幂模运算来保障信息安全传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值