#include<bits/stdc++.h>
using namespace std;
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
const int mod=1e9+7;
struct matrix{//这是一个板子,重载了'*'
int a[3][3];
matrix operator *(matrix b){
matrix c;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
c.a[i][j]=0;
//一定要记得初始化
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
c.a[i][j]=(c.a[i][j]+1LL*a[i][k]*b.a[k][j])%mod;
return c;
}
}S,T;
int main(){
int Q=read();
while(Q--){
int n=read();
if(n==1||n==2||n==3){
puts("1");
continue;
}
n-=3;
//因为题目给了我们前三项,我们的初始矩阵就用前三项
//所以我们需要特判前三项,特判通过之后n=n-3
S.a[0][0]=1;S.a[0][1]=1;S.a[0][2]=1;
//构建出初始矩阵
T.a[0][0]=1;T.a[0][1]=1;T.a[0][2]=0;
T.a[1][0]=0;T.a[1][1]=0;T.a[1][2]=1;
T.a[2][0]=1;T.a[2][1]=0;T.a[2][2]=0;
//构建出转移矩阵
while(n){if(n&1)S=S*T;T=T*T;n>>=1;}
//快速幂
printf("%d\n",S.a[0][0]);
}
return 0;
}
const LL mod=1e9+7;
struct matrix{
LL a[2][2];
matrix operator *(matrix b){
matrix c;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
c.a[i][j]=0;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c.a[i][j]=(c.a[i][j]+1LL*a[i][k]*b.a[k][j])%mod;
return c;
}
}S,T;
int main(){
S.a[0][0]=1;S.a[0][1]=1;
T.a[0][0]=1;T.a[0][1]=1;T.a[1][0]=1;T.a[1][1]=0;
LL n=read();
if(n==1||n==2){puts("1");return 0;}
n-=2;
while(n){if(n&1)S=S*T;T=T*T;n>>=1;}
printf("%lld\n",S.a[0][0]%mod);
return 0;
}
LL p,q,a1,a2,n,m;
struct matrix{
LL a[2][2];
matrix operator *(matrix b){
matrix c;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
c.a[i][j]=0;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c.a[i][j]=(c.a[i][j]+1LL*a[i][k]*b.a[k][j])%m;
return c;
}
}S,T;
int main(){
p=read();q=read();a1=read();a2=read();n=read();m=read();
if(n==1){printf("%lld\n",a1);return 0;}
if(n==2){printf("%lld\n",a2);return 0;}
//本题貌似没有构造需要特判的数据
n-=2;//n还是要-2
S.a[0][0]=a2;S.a[0][1]=a1;
T.a[0][0]=p;T.a[0][1]=1;
T.a[1][0]=q;T.a[1][1]=0;
while(n){if(n&1)S=S*T;T=T*T;n>>=1;}
printf("%lld\n",S.a[0][0]%m);
return 0;
}
原文:https://www.cnblogs.com/PPXppx/p/10587909.html