HLG 1251 Marshal's Confusion III

绝对的数论,之前想简单了

求a^(b^c)%317000011

很明显要用快速幂,而且是两次,但是具体要怎么算这两次呢?

要证明即使你这么算了也不影响最后的结果,即同余性不会改变。

这里用到了费马小定理a^p≡a%p(p为素数):

证明 a^(b^c)%p=a^((b^c)%(p-1))%p成立

b^c=r(p-1)+s  ---s=b^c%(p-1)

应用费马小定理:

a^(b^c)a^(r*(p-1)+s)a^(r*(p-1))*a^s≡(a^p*a^s)modpa^smodp

因此上面的式子得证

quickPow(a,quickPow(b,c,k-1),k),也是最关键的地方的由来

#include <iostream>
using namespace std;
const long long k=317000011;
long long quickPow(long long m,long long n,long long k)
{
    long long res=1;
    while(n)
    {
        if(n&1)
            res=(res*m)%k;
        n=n>>1;
        m=(m*m)%k;
    }
    return res;
}
int main()
{
    long long a,b,c;
    int T;
    cin>>T;
    while(T--)
    {
        cin>>a>>b>>c;
        cout<<quickPow(a,quickPow(b,c,k-1),k)<<endl;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值