11582: Gdut Count
时间限制: 1 Sec 内存限制: 128 MB提交: 4 解决: 3
[提交] [状态] [命题人:admin]
题目描述
Farmer John有n头奶牛.
某天奶牛想要数一数有多少头奶牛,以一种特殊的方式:
第一头奶牛为1号,第二头奶牛为2号,第三头奶牛之后,假如当前奶牛是第n头,那么他的编号就是2倍的第n-2头奶牛的编号加上第n-1头奶牛的编号再加上自己当前的n的三次方为自己的编号.
现在Farmer John想知道,第n头奶牛的编号是多少,估计答案会很大,你只要输出答案对于123456789取模.
某天奶牛想要数一数有多少头奶牛,以一种特殊的方式:
第一头奶牛为1号,第二头奶牛为2号,第三头奶牛之后,假如当前奶牛是第n头,那么他的编号就是2倍的第n-2头奶牛的编号加上第n-1头奶牛的编号再加上自己当前的n的三次方为自己的编号.
现在Farmer John想知道,第n头奶牛的编号是多少,估计答案会很大,你只要输出答案对于123456789取模.
输入
第一行输入一个T,表示有T组样例
接下来T行,每行有一个正整数n,表示有n头奶牛 (n>=3)
其中,T=10^4,n<=10^18
接下来T行,每行有一个正整数n,表示有n头奶牛 (n>=3)
其中,T=10^4,n<=10^18
输出
共T行,每行一个正整数表示所求的答案
样例输入
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; }