Farmer John有n头奶牛.
某天奶牛想要数一数有多少头奶牛,以一种特殊的方式:
第一头奶牛为1号,第二头奶牛为2号,第三头奶牛之后,假如当前奶牛是第n头,那么他的编号就是2倍的第n-2头奶牛的编号加上第n-1头奶牛的编号再加上自己当前的n的三次方为自己的编号.
现在Farmer John想知道,第n头奶牛的编号是多少,估计答案会很大,你只要输出答案对于123456789取模.
标签:stat matrix namespace this set rtu 奶牛 mem init
5
3
6
9
12
15
31
700
7486
64651
527023
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=6; const ll mod=123456789; struct matrix{ ll q[maxn][maxn]; matrix(){ memset(q,0,sizeof(q)); } void init(){ for(int i=0;i<maxn;i++)for(int j=0;j<maxn;j++)q[i][j]=(i==j); } matrix operator+(const matrix &x)const{ matrix s; for(int i=0;i<6;i++){ for(int j=0;j<6;j++){ s.q[i][j]=(q[i][j]+x.q[i][j])%mod; } } return s; } matrix operator*(const matrix &x)const{ matrix s; for(int i=0;i<6;i++){ for(int j=0;j<6;j++){ for(int k=0;k<6;k++){ s.q[i][j]=(s.q[i][j]+(q[i][k]*x.q[k][j])%mod)%mod; } } } return s; } matrix operator^(const ll &x)const{ matrix dis,now=(*this); dis.init(); ll cur=x; while(cur){ if(cur&1)dis=dis*now; now=now*now; cur>>=1; } return dis; } }; int T; ll n; matrix t,s,v; int main() { cin>>T; t.q[0][0]=1,t.q[0][1]=2,t.q[0][2]=1,t.q[0][3]=0,t.q[0][4]=0,t.q[0][5]=0; t.q[1][0]=1,t.q[1][1]=0,t.q[1][2]=0,t.q[1][3]=0,t.q[1][4]=0,t.q[1][5]=0; t.q[2][0]=0,t.q[2][1]=0,t.q[2][2]=1,t.q[2][3]=3,t.q[2][4]=3,t.q[2][5]=1; t.q[3][0]=0,t.q[3][1]=0,t.q[3][2]=0,t.q[3][3]=1,t.q[3][4]=2,t.q[3][5]=1; t.q[4][0]=0,t.q[4][1]=0,t.q[4][2]=0,t.q[4][3]=0,t.q[4][4]=1,t.q[4][5]=1; t.q[5][0]=0,t.q[5][1]=0,t.q[5][2]=0,t.q[5][3]=0,t.q[5][4]=0,t.q[5][5]=1; v.q[0][0]=2,v.q[1][0]=1,v.q[2][0]=27,v.q[3][0]=9,v.q[4][0]=3,v.q[5][0]=1; while(T--){ cin>>n; if(n==1){ cout<<1<<endl; continue; } if(n==2){ cout<<2<<endl; continue; } s=t^(n-2); s=s*v; cout<<s.q[0][0]%mod<<endl; } return 0; }
标签:stat matrix namespace this set rtu 奶牛 mem init
原文地址:https://www.cnblogs.com/czy-power/p/10551546.html