题目大意:
给你三个数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

京公网安备 11010502036488号