a^b%p and a*b%p快速幂
#include<cstdio>
int power(int a, int b, int p)
{
int ans=1%p;
for(;b;b>>=1)
{
if(b&1) ans=(long long)ans*a%p;
a=(long long)a*a%p;
}
return ans;
}
int main()
{
int a,b,c;
scanf("%d%d%d", &a, &b, &c);
printf("%d^%d mod %d=%d", a,b,c,power(a,b,c));
}
这就是快速幂模板吧,求a^b,其中1<=a,b<=10^9。
解法就是将b看成是二进制下的数,这样a^b就转化成a^(b的每一个二进制1对应的十进制数)比如b二进制为1111时,a^b=a^(1+2+4+8)=a^1*a^2*a^4*a^8,就这样拆分了。其中循环语句就是从低位到高位,从右到左判断b是否存在一个1,存在的话就乘以一个对应改二进制下的a。时间复杂度为o(log2 b)。
因为两个int相乘可能会超过int表示范围,所以long long运算后在强制转化为int。
求a*b%p, 其中1<=a,b,p<=10^18。
类似于快速幂,将b看为二进制数进行计算,例如当b二进制=1111时,a*b=a*(1+2+4+8)=a*1+a*2+a*4+a*8。时间复杂度为o(log 2 b)。
#include<cstdio>
long long mul(long long a, long long b, long long p)
{
long long ans=0;
for(; b; b>>=1)
{
if(b&1) ans = (ans+a)%p;
a=a*2%p;
}
}
int main()
{
long long a,b,p;
scanf("%lld%lld%lld", &a, &b, &p);
}