快速幂
Description
x^y 相信大家都会计算(for 循环相乘),但是当 y 很大的时候怎么办?(如:y=10^18 )
蒜头君经研究发现,想到了一个好办法,公式如下
f(x,y) 等于
: f(x, y/2) * f(x, y/2), y%2=0,y>0
: 1, y=0
: f(x, y/2) * f(x, y/2) * x, y%2=1,y>0
当然这不是快速幂最好的写法,有兴趣的同学可以了解一个快速幂的另一种写法。
Input
第一行输入一个整数 t(t <= 100)。
然后会有 t 行,每行有三个整数 x(1 <= x <= 10^9),y(1 <= y <= 10^18),p(1 <= p <= 10^9)。
Output
输出每行中 x^y % p 的值。
Sample Input 1
1
2 10 10000
Sample Output 1
1024
——摘自YCOJ
本题主要是定义函数的实现,题目又附带了公式,使这道题简单了许多,我们可以定义一个pow函数,整体实现快速幂的过程。
#include <bits/stdc++.h>
using namespace std;
long long pow (long long x,long long y,long long p){
if(y==0){
return 1;
}
else
if (y%2==0){
long long tmp= pow(x,y/2,p);
return tmp*tmp%p;
}else if(y%2!=0){
long long tmp= pow(x,y/2,p);
return tmp * tmp % p * x % p;
}
}
int main(){
long long n;
cin >> n;
for(long long i = 1;i <=n;i++){
long long a , b, p;
cin >> a >> b >> p;
cout << pow(a,b,p)<<endl;
}
return 0;
}