zoukankan      html  css  js  c++  java
  • HDU5950 Recursive sequence —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-5950

    Recursive sequence

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


    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.
     
    Source
     
    Recommend
    jiangzijing2015
     

    题意:

    求 f(n) = f(n−1) + 2*f(n−2) + n^4,其中 f(1)=a,f(2)=b

    题解:

    典型的矩阵快速幂的运用。关键是i^4怎么维护?我们可以当成求第i+1项,那么i^4就变成了(i+1)^4。那么这时我们可以用二项式定理从i^4、i^3、i^2、i^1、i^0的组合中得到(i+1)^4。也就是说总共需要维护:f[i+1]、f[i]、(i+1)^4、(i+1)^3、(i+1)^2、(i+1)^1、(i+1)^0。矩阵如下:






    代码如下:

     1 #include <bits/stdc++.h>
     2 #define rep(i,s,t) for(int (i)=(s); (i)<=(t); (i)++)
     3 #define ms(a,b) memset((a),(b),sizeof((a)))
     4 using namespace std;
     5 typedef long long LL;
     6 const LL mod = 2147493647;
     7 const int maxn = 1e5;
     8 
     9 struct Mat
    10 {
    11     LL mat[7][7];
    12     void init()
    13     {
    14         rep(i,0,6) rep(j,0,6)
    15             mat[i][j] = (i==j);
    16     }
    17 };
    18 
    19 Mat p = {   1, 2, 1, 4, 6, 4, 1,
    20             1, 0, 0, 0, 0, 0, 0,
    21             0, 0, 1, 4, 6, 4, 1,
    22             0, 0, 0, 1, 3, 3, 1,
    23             0, 0, 0, 0, 1, 2, 1,
    24             0, 0, 0, 0, 0, 1, 1,
    25             0, 0, 0, 0 ,0, 0, 1
    26         };
    27 
    28 Mat mul(Mat x, Mat y)
    29 {
    30     Mat s;
    31     ms(s.mat,0);
    32     rep(i,0,6) rep(j,0,6) rep(k,0,6)
    33         s.mat[i][j] += (x.mat[i][k]*y.mat[k][j])%mod, s.mat[i][j] %= mod;
    34     return s;
    35 }
    36 
    37 Mat qpow(Mat x, LL y)
    38 {
    39     Mat s;
    40     s.init();
    41     while(y)
    42     {
    43         if(y&1)  s = mul(s, x);
    44         x = mul(x, x);
    45         y >>= 1;
    46     }
    47     return s;
    48 }
    49 int main()
    50 {
    51     int T;
    52     scanf("%d",&T);
    53     while(T--)
    54     {
    55         LL n, a, b;
    56         scanf("%lld%lld%lld",&n,&a,&b);
    57         if(n == 1)
    58         {
    59             printf("%lld
    ",a);
    60             continue;
    61         }
    62         if(n == 2)
    63         {
    64             printf("%lld
    ",b);
    65             continue;
    66         }
    67 
    68         Mat x = p;
    69         x = qpow(x, n-2);
    70 
    71         LL ans = 0;
    72         ans = (ans + b*x.mat[0][0]) % mod;
    73         ans = (ans + a*x.mat[0][1]%mod) % mod;
    74         ans = (ans + 16*x.mat[0][2]%mod) % mod;
    75         ans = (ans + 8*x.mat[0][3]%mod) % mod;
    76         ans = (ans + 4*x.mat[0][4]%mod) % mod;
    77         ans = (ans + 2*x.mat[0][5]%mod) % mod;
    78         ans = (ans+x.mat[0][6]) % mod;
    79         printf("%lld
    ",ans);
    80     }
    81 }
    View Code


  • 相关阅读:
    PAT (Advanced Level) Practice 1100 Mars Numbers (20分)
    PAT (Advanced Level) Practice 1107 Social Clusters (30分) (并查集)
    PAT (Advanced Level) Practice 1105 Spiral Matrix (25分)
    PAT (Advanced Level) Practice 1104 Sum of Number Segments (20分)
    PAT (Advanced Level) Practice 1111 Online Map (30分) (两次迪杰斯特拉混合)
    PAT (Advanced Level) Practice 1110 Complete Binary Tree (25分) (完全二叉树的判断+分享致命婴幼儿错误)
    PAT (Advanced Level) Practice 1109 Group Photo (25分)
    PAT (Advanced Level) Practice 1108 Finding Average (20分)
    P6225 [eJOI2019]异或橙子 树状数组 异或 位运算
    P4124 [CQOI2016]手机号码 数位DP
  • 原文地址:https://www.cnblogs.com/DOLFAMINGO/p/7538632.html
Copyright © 2011-2022 走看看