为什么用单位矩阵乘后再乘[a2,a1]就可以?
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
long long p,q,a1,a2,n,mod;
struct node {
long long a[3][3];
void build(){
memset(a,0,sizeof(a));
}
void chu(){
a[1][1]=p,a[1][2]=q;
a[2][1]=1;
}
void qqq(){
a[1][1]=a2,a[2][1]=a1;
}
void dan(){
for(int i=1;i<=2;++i)a[i][i]=1;
}
node operator *(const node &b)const{
node res;
res.build();
for(int k=1;k<=2;++k){
for(int i=1;i<=2;++i){
for(int j=1;j<=2;++j){
res.a[i][j]=(res.a[i][j]+(a[i][k]*b.a[k][j]))%mod;
}
}
}
return res;
}
};
void pow_print(long long b) {
node a;
a.build();
a.chu();
node res;
res.build();
res.dan();
while(b){
if(b&1)res=res*a;
a=a*a;
b>>=1;
// for(int i=1;i<=2;++i){
// for(int j=1;j<=2;++j)
// cout<<res.a[i][j]<<' ';
// cout<<'\n';
// }
}
node q;
q.qqq();
cout<<(res*q).a[1][1]<<'\n';
}
int main() {
cin>>p>>q>>a1>>a2>>n>>mod;
if(n<=2) {
if(n==1)
cout<<a1;
else
cout<<a2;
return 0;
}
pow_print(n-2);
return 0;
}
/*
p q
1 0
*/
而直接用[a2,a1]乘就不行
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
long long p,q,a1,a2,n,mod;
struct node {
long long a[3][3];
void build(){
memset(a,0,sizeof(a));
}
void chu(){
a[1][1]=p,a[1][2]=q;
a[2][1]=1;
}
void qqq(){
a[1][1]=a2,a[2][1]=a1;
}
void dan(){
for(int i=1;i<=2;++i)a[i][i]=1;
}
node operator *(const node &b)const{
node res;
res.build();
for(int k=1;k<=2;++k){
for(int i=1;i<=2;++i){
for(int j=1;j<=2;++j){
res.a[i][j]=(res.a[i][j]+(a[i][k]*b.a[k][j]))%mod;
}
}
}
return res;
}
};
void pow_print(long long b) {
node a;
a.build();
a.chu();
node res;
res.build();
res.qqq();
while(b){
if(b&1)res=res*a;
a=a*a;
b>>=1;
// for(int i=1;i<=2;++i){
// for(int j=1;j<=2;++j)
// cout<<res.a[i][j]<<' ';
// cout<<'\n';
// }
}
node q;
q.qqq();
cout<<(res).a[1][1]<<'\n';
}
int main() {
cin>>p>>q>>a1>>a2>>n>>mod;
if(n<=2) {
if(n==1)
cout<<a1;
else
cout<<a2;
return 0;
}
pow_print(n-2);
return 0;
}
/*
p q
1 0
*/