zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    win7下的vxworks总结
    ubuntu 无法获得锁 /var/lib/dpkg/lock
    项目中用到了的一些批处理文件
    win7下安装 WINDRIVER.TORNADO.V2.2.FOR.ARM
    使用opencv统计视频库的总时长
    January 05th, 2018 Week 01st Friday
    January 04th, 2018 Week 01st Thursday
    January 03rd, 2018 Week 01st Wednesday
    January 02nd, 2018 Week 01st Tuesday
    January 01st, 2018 Week 01st Monday
  • 原文地址:https://www.cnblogs.com/czy-power/p/10551546.html
Copyright © 2011-2022 走看看