zoukankan      html  css  js  c++  java
  • HDU 5950:Recursive sequence(矩阵快速幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=5950

    题意:给出 a,b,n,递推出 f(n) = f(n-1) + f(n-2) * 2 + n ^ 4. f(1) = a, f(2) = b.

    思路:在比赛时候知道是矩阵快速幂,可是推不出矩阵.那个n^4不知道怎么解决。结束后问其他人才知道要构造一个7 * 7的矩阵,而不是3 * 3的..

    转自:http://blog.csdn.net/spring371327/article/details/52973534

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <cstring>
     5 #include <string>
     6 #include <cmath>
     7 #include <queue>
     8 #include <vector>
     9 using namespace std;
    10 #define N 1010
    11 #define INF 0x3f3f3f3f
    12 #define MOD 2147493647
    13 typedef long long LL;
    14 
    15 struct matrix
    16 {
    17     LL a[7][7];
    18 
    19     void init() {
    20         memset(a, 0, sizeof(a));
    21         for(int i = 0; i < 7; i++) a[i][i] = 1;
    22     }
    23 
    24     matrix operator * (matrix b) {
    25         matrix ans;
    26         LL tmp;
    27         for(int i = 0; i < 7; i++) {
    28             for(int j = 0; j < 7; j++) {
    29                 ans.a[i][j] = 0;
    30                 for(int k = 0; k < 7; k++) {
    31                     tmp = a[i][k] * b.a[k][j] % MOD;
    32                     ans.a[i][j] = (ans.a[i][j] + tmp % MOD) % MOD;
    33                 }
    34             }
    35         }
    36         return ans;
    37     }
    38 };
    39 
    40 matrix q_pow(matrix a, LL b)
    41 {
    42     matrix ans;
    43     ans.init();
    44     while(b) {
    45         if(b & 1) ans = ans * a;
    46         b >>= 1;
    47         a = a * a;
    48     }
    49     return ans;
    50 }
    51 
    52 int main()
    53 {
    54     matrix mo;
    55     memset(mo.a, 0, sizeof(mo.a));
    56     mo.a[0][1] = 1;
    57     mo.a[1][0] = 2; mo.a[1][1] = 1, mo.a[1][2] = 1, mo.a[1][3] = 4, mo.a[1][4] = 6, mo.a[1][5] = 4, mo.a[1][6] = 1;
    58     mo.a[2][2] = 1, mo.a[2][3] = 4, mo.a[2][4] = 6, mo.a[2][5] = 4, mo.a[2][6] = 1;
    59     mo.a[3][3] = 1, mo.a[3][4] = 3, mo.a[3][5] = 3, mo.a[3][6] = 1;
    60     mo.a[4][4] = 1, mo.a[4][5] = 2, mo.a[4][6] = 1;
    61     mo.a[5][5] = 1, mo.a[5][6] = 1;
    62     mo.a[6][6] = 1;
    63     int t;
    64     scanf("%d", &t);
    65     while(t--) {
    66         long long n, a, b;
    67         scanf("%I64d%I64d%I64d", &n, &a, &b);
    68         if(n == 1) printf("%I64d
    ", a);
    69         else if(n == 2) printf("%I64d
    ", b);
    70         else {
    71             matrix ans = q_pow(mo, n - 2);
    72             LL sum = 0;
    73             sum = (sum + ans.a[1][0] * a) % MOD;
    74             sum = (sum + ans.a[1][1] * b) % MOD;
    75             sum = (sum + ans.a[1][2] * 16) % MOD;
    76             sum = (sum + ans.a[1][3] * 8) % MOD;
    77             sum = (sum + ans.a[1][4] * 4) % MOD;
    78             sum = (sum + ans.a[1][5] * 2) % MOD;
    79             sum = (sum + ans.a[1][6]) % MOD;
    80             printf("%I64d
    ", sum);
    81         }
    82     }
    83     return 0;
    84 }
  • 相关阅读:
    poj 2728 Desert King
    uva 439 Knight Moves
    hdu 1875 畅通工程再续
    scau实验题 8600 骑士周游问题(有障碍物)
    scau实验题 8596 Longest Ordered Subsequence
    poj 1679 The Unique MST
    uva 527 Oil Deposits
    poj 2533 Longest Ordered Subsequence
    .net 程序员 java 开发入门
    Collation conflict occur at operation on User define funtion & table's column
  • 原文地址:https://www.cnblogs.com/fightfordream/p/6014119.html
Copyright © 2011-2022 走看看