老是忘记还是写下来记录一下
快速乘,和快速幂都是防止爆int,或long long,如果爆longlong可以选择两者结合,或者使用_int128(上网搜了还是不懂)
快速乘
#include"iostream"
using namespace std;
int main(){
long long a, b, m,sum=0;
cin >> a >> b >> m;
while (b){
if (b % 2){
sum = (sum + a) % m;
}
b = b / 2;
a = (a + a) % m;
}
cout << sum;
return 0;
}
快速幂
#include"iostream"
using namespace std;
int main(){
long long a, b, m,sum=1;
cin >> a >> b >> m;
while (b){
if (b&1){
sum = (sum*a) % m;
}
b >>= 1;
a = (a*a) % m;
}
cout << sum;
return 0;
}
两者代码没什么差别,主要就在于底数一个是乘,一个加。
下面就是两者的结合
这道例题是爆longlong的可以用_int128,也可以用两者结合
华华教月月做数学
#include"bits/stdc++.h"
using namespace std;
typedef long long ll;
ll a,b,p;
ll qpower(ll a,ll b){
ll res=0;
while(b){
if(b%2)res=(res+a)%p;
b/=2;
a=(a+a)%p;
}
return res;
}
ll qpow(ll a,ll b){
ll res=1;
while(b){
if(b%2)res=qpower(res,a)%p;
b=b/2;
a=qpower(a,a)%p;
}
return res;
}
int main(){
std::ios::sync_with_stdio(false);
int q;
cin>>q;
while(q--){
cin>>a>>b>>p;
cout<<qpow(a,b)<<endl;
}
return 0;
}
其实就是快速幂中的乘法改为了快速乘(其实是龟速乘,据说快速乘比普通乘法还要慢。。)。