zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    Grid表格的js触发事件
    C# 在获得鼠标点击事件时,如何判断Control键,Shift键被按下
    纠错《COM技术内幕》之ProgID
    C# 日期格式化
    C# 操作系统防火墙
    C# 开发和调用Web Service
    谓侠
    高维FWT
    单位根反演
    容斥 反演
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/10034542.html
Copyright © 2011-2022 走看看