快速幂

前置知识

用二进制表示数字的方法(需要熟练理解)

基本思想

快速幂的基本思想就是将运算进行"降幂",再利用二进制数字合并的原理减少运算次数。

例如,计算a^b则需要不停计算a*a;同理,计算a*b则需要不停计算a+a。

例题

1.求 a 的 b 次方对 p 取模的值,其中 1≤a,b,p≤10^9。(题目链接

#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
ll poww(ll a,ll b,ll p){
	ll ans=1;
	for(;b;b>>=1){
		if(b&1)ans=(ll)ans*a%p;
		a=(ll)a*a%p;
	}
	return ans%p;
}
int main(){
	ll a,b,p;
	cin>>a>>b>>p;
	cout<<poww(a,b,p)<<endl;
	return 0;
}

2.求 a 乘 b 对 p 取模的值,其中 1≤a,b,p≤10^18。(题目链接

这个题可以说是利用了快速幂的思想,即将一个乘法转换为多个加法,本质上与快速幂类似。

#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
ll mul(ll a,ll b,ll p){
	ll ans=0;
	for(;b;b>>=1){
		if(b&1)ans=(ans+a)%p;
		a=a*2%p;
	}
	return ans%p;
}
int main(){
	ll a,b,p;
	scanf("%lld%lld%lld",&a,&b,&p);
	printf("%lld
",mul(a,b,p));
	return 0;
}
原文地址:https://www.cnblogs.com/zbsy-wwx/p/11680632.html