protagonist

Gdut Count

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取模.

 

输入

第一行输入一个T,表示有T组样例
接下来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;
}

 

posted @ 2019-03-18 13:02  czy-power  阅读(165)  评论(0编辑  收藏  举报