快速幂问题求解

本文介绍了一种常用的快速幂算法,并提供了具体的实现代码。通过数学公式 (a*b)%c=(a%c*b%c)%c 来解决 A^B Mod C 的问题,有效避免了溢出。示例展示了如何使用此算法计算3^5 Mod 8的结果。

快速幂问题在一开始的ACM题还是很常见的。其中有一个很重要的数学公式:(a*b)%c=(a%c*b%c)%c。从这个公式中也可以推出(a*a)%c=(a%c*a%c)%c;

所以,对于求解A^B Mod C这样的问题,可以用这个公式来解决。

最重要的容易错的一点就是记得要用long long型,防止溢出。

对于求解A^B Mod C;

long long t=1;
while(b)
{
	if(b&1)           //判断b是不是偶数,如果不是,先*1次
		t=t*a%c;
	a=a*a%c;          //a自乘一次,相当与2^4=4^2;
	b>>=1;	          //b/2;
}

给出3个正整数A B C,求A^B Mod C。

例如,3 5 8,3^5 Mod 8 = 3。

Input

3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9)

Output

输出计算结果

Sample Input

3 5 8

Sample Output

3
#include <stdio.h>
int main()
{
	long long a,b,c;
	long long t;
	t=1;
	scanf("%lld%lld%lld",&a,&b,&c);
	while(b)
	{
		if(b&1)
			t=t*a%c;
		a=a*a%c;
		b>>=1;	
	}
	printf("%lld\n",t);
	return 0;
}

 

### 使用 C++ 实现快速幂求解乘法逆元 以下是通过快速幂方法计算乘法逆元的一个完整代码示例: ```cpp #include <iostream> using namespace std; // 定义模数 const int MOD = 1e9 + 7; // 快速幂函数 long long fast_pow(long long base, long long exp, long long mod) { long long result = 1; while (exp > 0) { if (exp & 1) { // 如果指数的当前位为1 result = (result * base) % mod; // 结果累乘并取模 } base = (base * base) % mod; // 底数平方并取模 exp >>= 1; // 指数右移一位(相当于整除2) } return result; } // 计算乘法逆元 long long multiplicative_inverse(long long a, long long mod) { return fast_pow(a, mod - 2, mod); // 费马小定理:a^(p-2) ≡ a^-1 (mod p),其中p为素数 } int main() { long long a, mod; cout << "请输入要计算逆元的数和模数:" << endl; cin >> a >> mod; // 判断是否存在逆元 if (__gcd(a, mod) != 1) { // gcd(a, mod) ≠ 1 表示不存在逆元 cout << "无法找到逆元,因为a和mod不互质。" << endl; } else { long long inverse = multiplicative_inverse(a, mod); cout << "数 " << a << " 关于模 " << mod << " 的乘法逆元是: " << inverse << endl; } return 0; } ``` #### 解析 上述程序实现了基于 **费马小定理** 的快速幂算法来求解乘法逆元[^2]。 1. 函数 `fast_pow` 是标准的快速幂实现方式,用于高效地计算 \( a^b \mod m \)[^2]。 2. 函数 `multiplicative_inverse` 基于费马小定理 \( a^{m-2} \equiv a^{-1} \ (\text{mod}\ m) \) 来计算乘法逆元[^2]。 3. 主函数部分会提示用户输入数值以及模数,并判断两者是否互质(\( \text{gcd}(a, m) = 1 \) 才存在逆元)[^2]。 --- ### 注意事项 - 若模数不是一个素数,则不能直接应用费马小定理,需改用扩展欧几里得算法或其他方法求解逆元。 - 当且仅当两个数互质时才存在乘法逆元[^4]。 --- 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值