【题解】P1939 矩阵加速(数列)
【P1939】题解
一:【题面】
略
二:【解法】
F,base构造见代码
三:【代码】
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long LL;
struct mat{
int a[4][4];
mat(){
memset(a,0,sizeof a);
}
mat operator*(mat b){
mat ans;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++){
ans.a[i][j]+=1LL*a[i][k]*b.a[k][j]%mod;
ans.a[i][j]%=mod;
}
return ans;
}
};
void solve(){
int n;cin>>n;
if(n<=3){
cout<<1<<"\n";
return ;
}
n-=3;
mat F,base;
F.a[1][1]=1;F.a[1][2]=1;F.a[1][3]=1;
F.a[2][1]=0;F.a[2][2]=0;F.a[2][3]=0;
F.a[3][1]=0;F.a[3][2]=0;F.a[3][3]=0;
base.a[1][1]=1;base.a[1][2]=1;base.a[1][3]=0;
base.a[2][1]=0;base.a[2][2]=0;base.a[2][3]=1;
base.a[3][1]=1;base.a[3][2]=0;base.a[3][3]=0;
while(n){
if(n&1) F=F*base;
base=base*base;
n>>=1;
}
cout<<F.a[1][1]<<"\n";
return ;
}
int main(){
int t;cin>>t;
while(t--) solve();
return 0;
}
//dp[i]=dp[i-1]+dp[i-3]
//F[i]
//dp[i] dp[i-1] dp[i-2]
//0 0 0
//0 0 0
//base
//1 1 0
//0 0 1
//1 0 0
//F[3]
//1 1 1
//0 0 0
//0 0 0

浙公网安备 33010602011771号