算法1
(暴力/STL) $O(n^2)$
不用说吧……
算法2
(快速幂) $O(n\log n)$
每一次维护$base\times a$,用$b$右移一位。
C++ 代码
#include<bits/stdc++.h>
#define fs(i,x,y,z) for(int i=x;i<=y;i+=z)
#define ll long long
using namespace std;
ll n,a,b,p;
ll ksm(ll x,ll y,ll z){
ll ans=1,base=x;
while(y){
if(y&1)ans*=base,ans%=z;
base*=base;base%=z;
y>>=1;
}
return ans;
}
int main(){
cin>>n;
fs(i,1,n,1){
cin>>a>>b>>p;
cout<<ksm(a,b,p)<<endl;
}
}
大佬可以说一下y&1 为啥可以判断b的个位是0还是1吗?谢谢!!
因为y&1表示y与1,比如100001和1与上的话,前面因为有0,都不行,而最后一位是1,所以y&1是由最后一位的值的值来判定的,也就是说y&1就是y最后一位的值,而最后一位的值如果是1就是奇数。
哦哦,懂了,谢谢!!
好的qwq
快速幂 应该是log2(k)吧 你前面那个n 是数据个数