int _qow(int a,int b,int c){ //快速幂
int ans=1;
while(b){
if(b&1) ans=(ans*a)%c;
b=b>>1;
a=a*a%c;
}
return ans;
}
上面是快速幂的模板,下面是等比数列加快速幂模板(例题:2019年河北省省赛B题 该题数据较大,要AC还是要改为long long)
#include<iostream>
using namespace std;
int n,q,p;
int _qow(int a,int b,int c){ //快速幂
int ans=1;
while(b){
if(b&1) ans=(ans*a)%c;
b=b>>1;
a=a*a%c;
}
return ans;
}
int getr(int k){ //等比数列
if(k==1) return n%p;
if(k%2==0) return (getr(k/2)+(getr(k/2)*_qow(n,k/2,p))%p)%p;
else return ((getr(k/2)+(getr(k/2)*_qow(n,k/2,p))%p)%p+_qow(n,k,p))%p;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n>>q>>p;
cout<<getr(q)<<endl;
}
return 0;
}