快速幂&龟速乘&快速乘

快速幂模板

#include<iostream>
using namespace std;
#define ll long long
#define Mod 1e+7;
ll fastPow(ll a,ll n){   
	ll base = a;
	ll sum =1;
	while(n){
		if(n&1)
		sum*=base;
		base*=base;
		n>>=1;}
	return sum;
}
int main (){
	int a,n; 
	cin>>a>>n;
	cout<<fastPow(a,n);  // a的n次方
}

龟速乘

用途:用于解决a,b,p都是<=1e18的数据。在快速幂中a*a是会long long溢出的。
然后龟速乘就是将乘法操作进行分步操作。
eg: 3 ∗ 15 = 3 ∗ ( 1 + 2 + 4 + 8 ) 3*15 =3*(1+2+4+8) 315=3(1+2+4+8) 3 ∗ 15 3*15 315拆分成了四步所以,每次就好叠加啦
代码如下:

//龟速乘 
ll mul(ll x,ll y,ll P){
	ll ans=0;
	while(y){
		if(y&1){
			ans=(ans+x)%P;
		}
		x=(x+x)%P;
		y>>=1;
	}
	return ans;
}
ll qpow(ll x,ll y){
	ll ans=1;
	while(y){
		if(y&1){
		   ans=Mul(ans,x);
		}
		x=Mul(x,x);
		y>>=1;
	}
    return ans;
}

快速乘

前面讲到啦龟速乘,将一个简单的乘法硬生生扯到啦log(n)复杂度。所以不好嘛,我还是尽可能的将乘法在o(1)时间内完成。
快速乘的根据是将long double和long long的转换

inline ll mul(ll x,ll y){
	ll  d=(ll)floor(x*(long double)y/P+0.5);
	ll ret=x*y-d*P;
	if(ret<0) ret+=P;
	return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

axtices

谢谢您的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值