且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

FZU 1752 a^b%c

更新时间:2021-12-10 23:25:38

题目连接:http://acm.fzu.edu.cn/problem.php?pid=1752
解题思路:要用快速幂,但不是单纯的用,如果单纯的用的话就会爆掉,要把乘法转化为加法,然后再用而且尽量用位运算。。。
上代码:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
LL multi(LL a, LL b, LL c)
{
    LL ans=0;
    a=a%c;
    while(b)
    {
        if(b&1)
        {
            ans+=a;//ans=(ans+a)%c;
            if(ans>=c)
            ans-=c;
        }

        a<<=1;//a=(a+a)%c;
        if(a>=c)
        a-=c;
        b>>=1;
    }
    return ans;
}
LL quick(LL a, LL b, LL c)
{
    LL ans=1;
    while(b)
    {
        if(b&1)
        ans=multi(ans, a, c);
        a=multi(a, a, c);
        b>>=1;
    }
    return ans;
}
int main()
{
     LL n,m,mod;
     while(~scanf("%I64d%I64d%I64d",&n,&m,&mod))
     {
        printf("%I64d\n", quick(n, m, mod));
     }
    return 0;
}
//100000000000000000