矩阵快速幂裸题,推出关系矩阵就行
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod = 123456789,N=6;
//c++超时,G++过了
struct matrix{
ll t[6][6];
}rela;
ll t[6][6]={
1,2,1,0,0,0,
1,0,0,0,0,0,
0,0,1,3,3,1,
0,0,0,1,2,1,
0,0,0,0,1,1,
0,0,0,0,0,1
};//关系矩阵
matrix mul(matrix x,matrix y){
matrix ans;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++){
ans.t[i][j]=0;
for(int k=0;k<N;k++){
ans.t[i][j]+=x.t[i][k]*y.t[k][j]%mod;
ans.t[i][j]%=mod;
}
}
return ans;
}
matrix fpow(matrix x,ll y){
matrix ret;
memset(ret.t,0,sizeof(ret));
for(int i=0;i<N;i++)ret.t[i][i]=1;
while(y){
if(y&1)ret=mul(ret,x);
x=mul(x,x);
y>>=1;
}
return ret;
}
int main(){
ll ans,T,n,inti[6]={2,1,27,9,3,1};
memcpy(rela.t,t,sizeof(t));
scanf("%lld",&T);
while(T--){
scanf("%lld",&n);
ans=0;
matrix a;
a=fpow(rela,n-2);
for(int i=0;i<N;i++){
ans+=a.t[0][i]*inti[i]%mod;
ans%=mod;
}
printf("%lld\n",ans);
}
}