zoukankan      html  css  js  c++  java
  • 牛客-斐波那契数列卷积

    题目传送门

    sol:

    官方题解的随便简单推导我推不出来,推了很久倒是推出了另一种解法。

    用 c[i][j] 表示 a[i] 的第 j 项,举个例子 c[3][0] = f[0] * f[3] = 0;  c[4][1] = f[1] * f[3] = 2;

    那么我们求 a[n] 也就是 c[n][0] + c[n][1] + ... + c[n][n];

    c[n][0] = f[0] * f[n] = f[0] * f[n - 1] + f[0] * f[n - 2] = c[n - 1][0] + c[n - 2][0];

    c[n][1] = f[1] * f[n - 1] = f[1] * f[n - 2] + f[1] * f[n - 3] = c[n - 1][1] + c[n - 2][1];

    由上可以发现好像 a[n] = a[n - 1] + a[n - 2]; 但是a[n] 、 a[n - 1] 、 a[n - 2]的项数不匹配;

    c[n][n] = f[n] * f[0] = f[n] * f[-1] + f[n] * f[-2],这里就不能用c[n - 1][n] 和 c[n - 2][n]来表示了,但是f[0] = 0,所以c[n][n] = 0; 可以忽略;

    又因为f[1] = 1, 所以 c[n][n - 1] = f[n - 1] * f[1] = f[n - 1];

    c[n - 1][n - 1] 也等于0;

    所以a[n] = a[n - 1] + a[n - 1] + f[n - 1] 那么就可以用矩阵快速幂来求解这题了。

    • 矩阵快速幂
      #include "bits/stdc++.h"
      using namespace std;
      typedef long long LL;
      const int MOD = 998244353;
      struct Mat {
          int mat[5][5];
          Mat() {memset(mat, 0, sizeof(mat));}
          friend Mat operator * (Mat a, Mat b) {
              Mat c;
              for (int k = 1; k <= 4; k++)
              for (int i = 1; i <= 4; i++)
              for (int j = 1; j <= 4; j++)
              c.mat[i][j] = (c.mat[i][j] + 1LL * a.mat[i][k] * b.mat[k][j]) % MOD;
              return c;
          }
      };
      Mat mat_pow(Mat n, LL k) {
          Mat ans;
          for (int i = 1; i <= 4; i++)
              ans.mat[i][i] = 1;
          while (k) {
              if (k & 1) ans = ans * n;
              n = n * n;
              k >>= 1;
          }
          return ans;
      }
      int main() {
          LL n;
          scanf("%lld", &n);
          Mat m;
          m.mat[1][1] = m.mat[1][2] = m.mat[1][3] = 1;
          m.mat[2][1] = m.mat[4][3] = 1;
          m.mat[3][3] = m.mat[3][4] = 1;
          m = mat_pow(m, n - 1);
          printf("%d
      ", m.mat[1][3]);
          return 0;
      }
  • 相关阅读:
    linux nfs
    gsoap
    error: ignoring return value of 编译错误处理
    SSIS可靠性和扩展性—错误输出
    SSIS中的脚本—脚本组件
    SQL点滴24—监测表的变化(转载)
    SSIS中的脚本—脚本任务
    SSIS可靠性和扩展性—简介
    SSIS中的脚本—表达式
    SSIS可靠性和扩展性—可扩展性
  • 原文地址:https://www.cnblogs.com/Angel-Demon/p/11579966.html
Copyright © 2011-2022 走看看