预备知识:
a*b%p=((a%p)*b)%p
(a+b)%p=(a%p+b)%p
快速幂就是快速求一个数的幂
两个整数a,b,求a^b
把b分解成几个2的次方的和,然后就相当于做一个指数乘法
比如说2^11
11=2^3+2^1+2^0
ans=2^(2^3+2^1+2^0)=2^(2^3)*2^(*2^1)+2^(2^0)
代码:
long long ksm(long long a,long long b){
long long ans=1;
while(b){
if(b&1==1) ans*=a; //是因为3/2=1,有一个a^1要处理
a*=a;
b/=2;
}
return ans;
}
有一道思想一致的题:求a*b%p的结果,1<=a,b。p<=10^18。
比如11*16
16=2^4;
ans=11*2^4
代码如下:
long long zc(long long a,long long b,long long c){
long long ans=0;
while(b){
if(b&1==1)ans=(ans+a)%c;
a=(a+a)%c;
b/=2;
}
return ans;
}
原文地址:https://www.cnblogs.com/SUMMER20020929/p/9751109.html
时间: 2024-10-07 21:47:35