当前位置 博文首页 > cax1165:求乘方取模(快速幂+慢速乘法模板)

    cax1165:求乘方取模(快速幂+慢速乘法模板)

    作者:[db:作者] 时间:2021-09-04 09:19

    求乘方取模

    题目描述:
    给定非负整数A、B、M,求(A ^ B) mod M。
    输入描述 Input Description
    包含多组输入,输入处理到EOF。
    每组输入仅一行,三个用空格隔开的非负整数A、B、M。
    输出描述:
    对于每组输入,输出一行,一个非负整数,即(A ^ B) mod M。
    样例输入:
    2 3 100006
    32 71 83
    900 800 777
    样例输出:
    8
    5
    219
    数据范围及提示:
    0 <= A, B < 8 * 10^18。
    0 < M < 8 * 10^18。
    保证A和B不同时为0。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    unsigned long long a,b,m;
    unsigned long long quick_mul(unsigned long long a,unsigned long long b,unsigned long long mod)//慢速乘法模板
    {
        unsigned long long ans=0;
        while(b)
        {
            if(b&1)
            {
                b--;
                ans=(ans+a)%mod;
            }
            b>>=1;
            a=(a+a)%mod;
        }
        return ans;
    }
    unsigned long long quick_mi(unsigned long long a,unsigned long long b,unsigned long long mod)//快速幂模板
    {
        unsigned long long ans=1;
        while(b)
        {
            if(b&1)
            ans=quick_mul(ans,a,mod);
            b>>=1;
            a=quick_mul(a,a,mod);
        }
        return ans;
    }
    int main()
    {
        while(cin>>a>>b>>m)//a^b%m
        cout<<quick_mi(a,b,m)<<endl;
        return 0;
    }
    cs