一、问题描述
给出三个数n、p、q,求S的值。
其中:
二、代码
/*
求(q+q^2+q^3+...+q^n)%p
=>构造矩阵{{q,q},{0,1}}或{{q,1},{0,1}},然后求其n次幂即可得结果
*/
#include<iostream>
#include<cstring>
using namespace std;
#define ll long long
#define N 2//矩阵列数
//返回值写法
struct node{//用结构体来做返回值,避免直接返回二维数组
ll a[N][N];
};
node multi(node a,node b,ll p){
node t;
memset(t.a,0,sizeof(t.a));
for(int i=0;i<N;++i)//行
for(int j=0;j<N;++j)//列
for(int z=0;z<N;++z)
t.a[i][j]+=a.a[i][z]*b.a[z][j],t.a[i][j]%=p;
return t;
}
ll qpow(node a,ll n,ll p){
node ans;
ans.a[0][0]=1,ans.a[0][1]=0,ans.a[1][0]=0,ans.a[1][1]=1;//单位矩阵
while(n){
if(n&1) ans=multi(ans,a,p);
a=multi(a,a,p);
n>>=1;
}
return ans.a[0][1];
}
int main(){
int T;
ll q,n,p;
cin>>T;
while(T--){
cin>>q>>n>>p;
node ans;
ans.a[0][0]=q,ans.a[0][1]=q,ans.a[1][0]=0,ans.a[1][1]=1;
cout<<qpow(ans,n,p);
if(T) cout<<endl;
}
return 0;
}