zoukankan      html  css  js  c++  java
  • UVA Recurrences 矩阵相乘+快速幂

    题目大意:

      f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n - 3) + ... + ad f(n - d),已给递推公式,求f(n)的大小。

    解题思路:

      n很大,所以我们就要构造矩阵,运用矩阵快速幂来求解。//题目描述上口口声声说int范围内,但是大家一定不要天真!!!!!!

     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <cstdio>
     4 #include <algorithm>
     5 #include <vector>
     6 #include <queue>
     7 #include <cstring>
     8 using namespace std;
     9 
    10 #define LL long long
    11 const int maxn = 18;
    12 LL d, m;
    13 struct mat
    14 {
    15     LL p[maxn][maxn];
    16 };
    17 
    18 mat mul (mat a, mat b);
    19 mat pow (LL n, mat a, mat b);
    20 
    21 int main ()
    22 {
    23     LL n;
    24     mat a, b;
    25 
    26     while (scanf ("%lld %lld %lld", &d, &n, &m), n+m+d)
    27     {
    28         memset (a.p, 0, sizeof(a.p));
    29         memset (b.p, 0, sizeof(b.p));
    30 
    31         for (int i=0; i<d; i++)//构造矩阵
    32         {
    33             scanf ("%lld", &a.p[i][0]);
    34             a.p[i][0] %= m;
    35             a.p[i][i+1] = 1;
    36         }
    37         for (int i=0; i<d; i++)//这个矩阵要反过来输入!!!!!!
    38             {
    39                 scanf ("%lld", &b.p[0][d-i-1]);
    40                 b.p[0][i] %= m;
    41             }
    42 
    43 
    44         if (d < n)
    45         {
    46             b = pow (n-d, a, b);
    47             printf ("%lld
    ", b.p[0][0]);
    48         }
    49         else
    50             printf ("%lld
    ", b.p[0][d-n]);
    51     }
    52     return 0;
    53 }
    54 
    55 mat mul (mat a, mat b)
    56 {
    57     mat c;
    58     memset (c.p, 0, sizeof(c.p));
    59     for (int i=0; i<d; i++)
    60         for (int j=0; j<d; j++)
    61         {
    62             for (int k=0; k<d; k++)
    63                 c.p[i][j] = (c.p[i][j] + a.p[i][k] * b.p[k][j]) % m;
    64         }
    65         return c;
    66 }
    67 mat pow (LL n, mat a, mat b)
    68 {
    69     while (n)
    70     {
    71         if (n % 2)
    72             b = mul (b, a);
    73         a = mul (a, a);
    74         n /= 2;
    75     }
    76     return b;
    77 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    怎样评价海贼王中艾斯的死?
    interleaving-string
    打败微信的将是怎么样的一款产品?
    javascript实例——文本特效篇(包含3个小例子)
    javascript实例——时间日期篇(包含5个实例)
    【转】Js获取当前日期时间及其它操作
    【转】外国朋友出的js题目,你能对几道
    【转】30+有用的CSS代码片段
    php的ajax简单实例
    Border属性的各种变化
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4360985.html
Copyright © 2011-2022 走看看