C++ 快速幂模板

本文介绍了C++中解决大数快速幂运算的方法,通过分解指数为偶数和奇数的情况,减少计算次数,避免溢出问题。文章详细讲解了优化过程,包括每次计算后取模和使用位运算提升效率。

注:这是本蒟蒻的第一篇博客,语言表述方面可能有些欠缺,但我自认为还讲的挺清楚的

目录

让我们开始吧!

这就结束了?

如何优化?

进一步优化

结束了,点个赞把qaq


让我们开始吧!

我们常常遇到这样的问题

给你三个数a,b,p

a^{b} mod p = ?

首先很多人会想到用<cmath>库里的pow函数来求解:

于是就有了下面这段代码

#include<cstdio>
#include<iostream>
#include<cmath> 
using namespace std;
long long a,b,p;
int main(){
	scanf("%ld%ld%ld",&a,&b,&p);
	long long ans = pow(a,b);
	ans%=p;
	printf("%ld",ans);
	return 0;
}

值得注意的是 因为pow返回的是浮点数,所以不能直接取模,向下面这样就会报错:

 而浮点数被复值到ans后自动转化成整数,所以换一行取模即可

这就结束了?

答案是没有

       由上图可见,即使开了long long ,a^{b}这个是数还是太大了,在pow计算的过程中很容易溢出而导致结果错误。

        如果我们算一次就取一次摸,是不是就不会溢出了?

        因为同余定理(如果a mod p=0,b mod p=0,那么(a+b) mod p = 0)的存在,算一次就取一次摸不会影响答案的正确性

        代码奉上

#include<cstdio>
#include<iostream>
#include<cmath> 
using namespace std;
long lon
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值