华华教月月做数学 题解

华华教月月做数学

https://ac.nowcoder.com/acm/problem/23046

题目大意:

给你三个数A,B,P,求

快速幂模板题/xk

但是,我们注意到,P的值很大,可以达到,所以,我们不能直接打快速幂,我们需要搞个龟速乘进去。

代码:

#include<bits/stdc++.h>
using namespace std;
inline unsigned long long ksc(unsigned long long x,unsigned long long y,unsigned long long p){
    unsigned long long ans=0;
    while(y){
        if(y&1){
            ans=(ans+x)%p;
        }
        x=(x+x)%p;
        y>>=1;
    }
    return ans;
}
inline unsigned long long ksm(unsigned long long x,unsigned long long y,unsigned long long p){
    unsigned long long ans=1;
    while(y){
        if(y&1){
            ans=ksc(ans,x,p);
        }
        x=ksc(x,x,p);
        y>>=1;
    }
    return ans;
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        unsigned long long A,B,P;
        scanf("%llu%llu%llu",&A,&B,&P);
        printf("%llu\n",ksm(A,B,P));
    }
    return 0;
}

但是,龟速乘实在是烦,我们强烈要求取代龟速乘,怎么办?

我们直接用__int128储存中间计算结果就好辣!

#include<bits/stdc++.h>
using namespace std;
inline unsigned long long ksc(__int128 x,__int128 y,unsigned long long p){
    x*=y;
    return x%p;
}
inline unsigned long long ksm(unsigned long long x,unsigned long long y,unsigned long long p){
    unsigned long long ans=1;
    while(y){
        if(y&1){
            ans=ksc(ans,x,p);
        }
        x=ksc(x,x,p);
        y>>=1;
    }
    return ans;
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        unsigned long long A,B,P;
        scanf("%llu%llu%llu",&A,&B,&P);
        printf("%llu\n",ksm(A,B,P));
    }
    return 0;
}

关于龟速乘

它死了/x

全部评论
__int128还要看编译器的吧,一般是不是用不了
点赞 回复 分享
发布于 2020-07-05 11:05
这个龟速乘是比普通的乘快一点吗 我用普通的乘答案不对是因为什么原因
点赞 回复 分享
发布于 2020-05-21 15:58

相关推荐

昨天 18:09
门头沟学院 Java
点赞 评论 收藏
分享
06-01 21:50
已编辑
天津理工大学 Java
点赞 评论 收藏
分享
07-01 13:37
门头沟学院 Java
steelhead:不是你的问题,这是社会的问题。
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务