题目
xyx^yxy当y很大,采用如下方式
{f(x,y2)×f(x,y2),(y%2=0,y>0)1,y=0f(x,y2)×f(x,y2)×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. ⎩⎨⎧f(x,2y)×f(x,2y),(y%2=0,y>0)1,y=0f(x,2y)×f(x,2y)×x,(y%2=1,y>0)
第一行输入t(t≤100)(t\leq 100)(t≤100)。
t行,每行有三个整数x(1≤x≤1091\leq x \leq 10^91≤x≤109),y(1≤y≤10181\leq y \leq 10^{18}1≤y≤1018),p(1≤p≤1091\leq p \leq 10^91≤p≤109)。
输出xy%px^y\%pxy%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;
}