(递归)快速幂

题目

x y x^y 当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 ) \left\{\begin{matrix} & f(x,\frac{y}{2})\times f(x,\frac{y}{2}),(y\%2=0,y>0)\\ & 1,y=0\\ & f(x,\frac{y}{2})\times f(x,\frac{y}{2})\times x ,(y\%2=1,y>0) \end{matrix}\right.
第一行输入t ( t 100 ) (t\leq 100)
t行,每行有三个整数x( 1 x 1 0 9 1\leq x \leq 10^9 ),y( 1 y 1 0 18 1\leq y \leq 10^{18} ),p( 1 p 1 0 9 1\leq p \leq 10^9 )。
输出 x y % p x^y\%p 的值。
样例输入
1
2 10 10000
样例输出:
1024

分析与解答:

直接用递归,log(n)的时间复杂度。
这里注意%p因为p有可能是1,所以每个都要加%p,还有,尽量每个数都加上%p,如果k*k%p*x%p;少了中间那个%p,就出错了

#include<iostream>
using namespace std;
long long f(long long x,long long y,long long p){
	if(y==0) return 1%p;
	else if(y%2==0) {
		long long k=f(x,y/2,p);
		return k*k%p;
	}
	else {
		long long k=f(x,y/2,p);
		return k*k%p*x%p;
	}
}
int main(){
	int t;cin>>t;
	while(t--){
		long long x,y,p;
		cin>>x>>y>>p;
		cout<<f(x,y,p)<<endl;
	}
	return 0;
}
发布了218 篇原创文章 · 获赞 131 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/89045030