码迷,mamicode.com
首页 > 其他好文 > 详细

a^b%p and a*b%p快速幂

时间:2018-11-28 22:08:18      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:mod   循环   快速幂   ret   cst   col   code   log   for   

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

 

a^b%p and a*b%p快速幂

标签:mod   循环   快速幂   ret   cst   col   code   log   for   

原文地址:https://www.cnblogs.com/dongdong25800/p/10034542.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!