华华教月月做数学---快速幂 & 快速乘 |__int128

华华你可真棒,自己要帮月月做题目,又不会写程序还想偷懒!
在这里插入图片描述
在这里插入图片描述
这题属于快速幂的模板题,但与模板不同的是数据范围更大了,1e18 的数据范围如果直接×的话会爆LL。所以除了采用快速幂外,还采用了快速乘的方法,有关快速乘的说明,可以参考下面这篇博客。

https://www.cnblogs.com/812-xiao-wen/p/10543023.html

using namespace std;
#include<bits/stdc++.h>
typedef long long LL;
LL mul(LL a,LL b,LL p){//快速乘
    LL ans=0;
    while(b){
        if(b & 1){
            ans=(ans+a)%p;
        }
        a=(a*2)%p;
        b=b>>1;
    }
    return ans;
}

LL solve(LL a,LL b,LL p){//快速幂
    LL ans=1;
    while(b){
        if(b & 1)
        {
            ans=mul(ans,a,p);
        }
        a=mul(a,a,p);
        b=b>>1;
    }
    return ans;
}

int main(){
    int t;
    cin>>t;
    while(t--)
    {
        LL a,b,p;
        cin>>a>>b>>p;
        cout<<solve(a%p,b,p)<<"\n";
    }
    return 0;
}

除了用快速乘,上面的博客中还介绍了C++中的一种非常强大的数据类型__int128,可以装下2^128级别的数据。

using namespace std;
#include<bits/stdc++.h>
typedef long long LL;
LL solve(LL a,LL b,LL p){//快速幂
    LL ans=1;
    while(b){
        if(b & 1)
        {
            ans=((__int128_t)ans*a%p);
        }
        a=((__int128_t)a*a%p);
        b=b>>1;
    }
    return ans;
}

int main(){
    int t;
    cin>>t;
    while(t--)
    {
        LL a,b,p;
        cin>>a>>b>>p;
        cout<<solve(a%p,b,p)<<"\n";
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值