矩陣補題、、、、、
矩陣快速冪板子
const int z = 2;
struct ju{
long long a[z][z];
};
ju muli(ju A,ju B,int mod){
ju C;
for(int i=0;i<z;++i){
for(int j=0;j<z;++j){
C.a[i][j]=0;
for(int k=0;k<z;++k){
C.a[i][j]+=A.a[i][k]*B.a[k][j];
C.a[i][j]%=mod;
}
}
}
return C;
}
ju init(){
ju res;
for(int i=0;i<z;++i){
for(int j=0;j<z;++j){
if(i==j)res.a[i][j]=1;
else res.a[i][j]=0;
}
}
return res;
}
ju pow(ju A,int n,int mod){
ju res=init(),temp=A;
for(;n;n/=2){
if(n&1)res=muli(res,temp,mod);
temp=muli(temp,temp,mod);
}
return res;
}
void print(ju A){
for(int i=0;i<z;++i){
for(int j=0;j<z;++j){
cout<<A.a[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
第一題
題目傳送門 2019河北省大學生程序設計競賽(重現賽) B題
題意: 意思大概就是叫你求等比數列的前n項和,其中一種解法就是矩陣快速冪。。。。
/*
s[i]=s[i-1]*q+q;
|s 1|*|q 0|
|0 1| |q 1|
|sq+q 1|
|0 1|
*/
s[i] 表示的就是S, 然後 後面的矩陣是個常量。。。。。