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 }
  • 相关阅读:
    tensorflow笔记1_入门案例
    keras_非线性回归
    python_神经网络识别手写数字0-9
    python_天气查询小程序_1
    打开网站URL遇到“HTTP Error 418:”问题
    笔记1-1三层交换机实现vlan间路由
    用python写一个简单的BP神经网络
    linux系统定时检查网络状态python脚本
    文件名过长,无法删除。
    du 和 df命令
  • 原文地址:https://www.cnblogs.com/fightfordream/p/6014119.html
Copyright © 2011-2022 走看看