题目:给定正整数A、B、P,求A的B次方mod P的值。(其中A、B、P均小于等于10的18次方)
题解:看到这种A的B次方mod P的第一反应应该是用pow(A,B)函数省事操作,当看到后面的数据范围之后,第二反应是应该是个快速幂,毕竟快速幂是能够处理10的18次方的数据的。但是这个时候要想一下,10的18次方两个数字去相乘的时候会不会爆long long,答案是会的,所以这个时候要能想到快速乘,将快速乘运用到快速幂的乘法里面去,这样子就很好的解决了爆long long 的尴尬。
c++代码:
#include<bits/stdc++.h>
using namespace std;
long long fast_mul(long long a,long long b,long long p)
{
long long ans=0;
while(b)
{
if(b&1) ans=(ans+a)%p;
a=(a+a)%p;
b=b>>1;
}
return ans;
}
long long fast_pow(long long a,long long b,long long p)
{
long long ans=1;
while(b)
{
if(b&1) ans=fast_mul(ans,a,p);
a=fast_mul(a,a,p);
b=b>>1;
}
return ans;
}
int main()
{
int n;
cin>>n;
while(n--)
{
long long a,b,p;
cin>>a>>b>>p;
cout<<fast_pow(a,b,p)<<endl;
}
}
java代码:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
BigInteger a,b,p;
for(int i=1;i<=n;i++)
{
a=in.nextBigInteger();
b=in.nextBigInteger();
p=in.nextBigInteger();
System.out.println(a.modPow(b, p));
}
}
}