• 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;
    }
  • 相关阅读:
    减少mysql存储列的方法
    Installation of Munin node/master ¶
    they're hiring
    减少mysql存储列的方法
    linux munin 服务器监控 安装配置«海底苍鹰(tank)博客
    用C写apache模块编译教程(经验证)
    SDUT——Kbased Numbers
    【人在运维囧途_06】 借助 sniffer 诊断 Linux 网络故障
    iOS 企业证书发布app 流程
    警告: 隐式声明与内建函数‘exit’不兼容
  • 原文地址:https://www.cnblogs.com/czy-power/p/10551546.html
Copyright © 2020-2023  润新知