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);
}

 

posted @ 2018-11-28 20:49  paranoid。  阅读(688)  评论(0编辑  收藏  举报