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

求乘方取模

题目描述:
给定非负整数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;
}
posted @ 2016-08-23 20:21  抽空的太阳  阅读(134)  评论(0编辑  收藏  举报