快速乘应用原因:当两个大数进行相乘进行取模(a*b%c)时,运算a*b可能会爆long long的范围,这时候就需要用到 快速乘 算法解决算术溢出的问题。
原理:快速乘是利用乘法分配律将a*b分解成多个式子相加(将后面一个乘数转化为二进制的形式计算)求解。例如:12*11=12*1011(2)=12*2^3+12*2^1+12*2^0=96+24+12=132。
注意:快速乘解决a*b%c算术溢出问题。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll fastc(ll a,ll b,ll p){
ll ans = 0;
while(b){
if(b % 2 == 1) ans = (ans + a) % p;
a= a * 2 % p;
b /= 2;
}
return ans;
}
int main(){
}
运用快速乘法的快速幂:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll fastc(ll a,ll b,ll p){
ll ans = 0;
while(b){
if(b % 2 == 1) ans = (ans + a) % p;
a= a * 2 % p;
b /= 2;
}
return ans;
}
ll quikpow(ll a,ll b,ll p){
ll ans = 1;
while(b){
if(b % 2 == 1) ans = fastc(ans,a,p)%p;
a = fastc(a,a,p) % p;
b /= 2;
}
return ans;
}
int main(){
return 0;
}