zoukankan      html  css  js  c++  java
  • HDU 5950 Recursive sequence 递推转矩阵

    Recursive sequence

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 2882    Accepted Submission(s): 1284


    Problem Description
    Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers a and b on a blackboard. And then, the cows would say their identity number one by one. The first cow says the first number a and the second says the second number b. After that, the i-th cow says the sum of twice the (i-2)-th number, the (i-1)-th number, and i4. Now, you need to write a program to calculate the number of the N-th cow in order to check if John’s cows can make it right. 
     
    Input
    The first line of input contains an integer t, the number of test cases. t test cases follow.
    Each case contains only one line with three numbers N, a and b where N,a,b < 231 as described above.
     
    Output
    For each test case, output the number of the N-th cow. This number might be very large, so you need to output it modulo 2147493647.
     
    Sample Input
    2
    3 1 2
    4 1 10
     
    Sample Output
    85
    369
     
    Hint
    In the first case, the third number is 85 = 2*1十2十3^4. In the second case, the third number is 93 = 2*1十1*10十3^4   and the fourth number is 369 = 2 * 10 十 93 十 4^4.
     
    题意     f[n]=f[n-1]+2*f[n-2]+n^4; f[1]=a f[2]=b   求第n项
    解析     直接递推肯定会超时的   所以 构造一个7*7系数矩阵 直接快速幂解出来  由于现在比较菜 只会最简单的矩阵 勉强可以写出来。。。。
     
    1 2 1 0 0 0 0         f[i-1]        f[i]
    1 0 0 0 0 0 0         f[i-2]        f[i-1]  
    0 0 1 4 6 4 1    i^4          (i+1)^4
    0 0 0 1 3 3 1       *    i^3                  =            (i+1)^3
    0 0 0 0 1 2 1    i^2          (i+1)^2
    0 0 0 0 0 1 1    i            i+1
    0 0 0 0 0 0 1      1           1  
     
    AC代码
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const ll mod=2147493647,maxn=7;
     5 struct Matrix
     6 {
     7     ll m[maxn][maxn];
     8     Matrix()
     9     {
    10         memset(m,0,sizeof(m));
    11     }
    12     void init()
    13     {
    14         for(int i=0; i<maxn; i++)
    15             for(int j=0; j<maxn; j++)
    16                 m[i][j]=(i==j);
    17     }
    18     Matrix  operator +(const Matrix &b)const
    19     {
    20         Matrix c;
    21         for(int i=0; i<maxn; i++)
    22         {
    23             for(int j=0; j<maxn; j++)
    24             {
    25                 c.m[i][j]=(m[i][j]+b.m[i][j])%mod;
    26             }
    27         }
    28         return c;
    29     }
    30     Matrix  operator *(const Matrix &b)const
    31     {
    32         Matrix c;
    33         for(int i=0; i<maxn; i++)
    34         {
    35             for(int j=0; j<maxn; j++)
    36             {
    37                 for(int k=0; k<maxn; k++)
    38                 {
    39                     c.m[i][j]=(c.m[i][j]+(m[i][k]*b.m[k][j])%mod)%mod;
    40                 }
    41             }
    42         }
    43         return c;
    44     }
    45     Matrix  operator^(const ll &t)const
    46     {
    47         Matrix ans,a=(*this);
    48         ans.init();
    49         ll n=t;
    50         while(n)
    51         {
    52             if(n&1) ans=ans*a;
    53             a=a*a;
    54             n>>=1;
    55         }
    56         return ans;
    57     }
    58 };
    59 int main()
    60 {
    61     int t;
    62     ll n,m,a,b;
    63     scanf("%d",&t);
    64     while(t--)
    65     {
    66         scanf("%lld %lld %lld",&n,&a,&b);
    67         if(n==1)
    68         {
    69             cout<<a%mod<<endl;
    70             continue;
    71         }
    72         if(n==2)
    73         {
    74             cout<<b%mod<<endl;
    75             continue;
    76         }
    77         Matrix temp;
    78         temp.m[0][0]=1,temp.m[0][1]=2,temp.m[0][2]=1,temp.m[0][3]=0,temp.m[0][4]=0,temp.m[0][5]=0;temp.m[0][6]=0;
    79         temp.m[1][0]=1,temp.m[1][1]=0,temp.m[1][2]=0,temp.m[1][3]=0,temp.m[1][4]=0,temp.m[1][5]=0;temp.m[1][6]=0;
    80         temp.m[2][0]=0,temp.m[2][1]=0,temp.m[2][2]=1,temp.m[2][3]=4,temp.m[2][4]=6,temp.m[2][5]=4;temp.m[2][6]=1;
    81         temp.m[3][0]=0,temp.m[3][1]=0,temp.m[3][2]=0,temp.m[3][3]=1,temp.m[3][4]=3,temp.m[3][5]=3;temp.m[3][6]=1;
    82         temp.m[4][0]=0,temp.m[4][1]=0,temp.m[4][2]=0,temp.m[4][3]=0,temp.m[4][4]=1,temp.m[4][5]=2;temp.m[4][6]=1;
    83         temp.m[5][0]=0,temp.m[5][1]=0,temp.m[5][2]=0,temp.m[5][3]=0,temp.m[5][4]=0,temp.m[5][5]=1;temp.m[5][6]=1;
    84         temp.m[6][0]=0,temp.m[6][1]=0,temp.m[6][2]=0,temp.m[6][3]=0,temp.m[6][4]=0,temp.m[6][5]=0;temp.m[6][6]=1;
    85         Matrix aa,bb;
    86         bb.m[0][0]=b%mod;
    87         bb.m[1][0]=a%mod;
    88         bb.m[2][0]=81;
    89         bb.m[3][0]=27;
    90         bb.m[4][0]=9;
    91         bb.m[5][0]=3;
    92         bb.m[6][0]=1;
    93         aa=temp^(n-2);
    94         aa=aa*bb;
    95         cout<<aa.m[0][0]%mod<<endl;
    96     }
    97     return 0;
    98 }
        
  • 相关阅读:
    手机号码正则表达式
    POJ 3233 Matrix Power Series 矩阵快速幂
    UVA 11468
    UVA 1449
    HDU 2896 病毒侵袭 AC自动机
    HDU 3065 病毒侵袭持续中 AC自动机
    HDU 2222 Keywords Search AC自动机
    POJ 3461 Oulipo KMP模板题
    POJ 1226 Substrings KMP
    UVA 1455 Kingdom 线段树+并查集
  • 原文地址:https://www.cnblogs.com/stranger-/p/9016953.html
Copyright © 2011-2022 走看看