Advertisement
prog3r

Это вот эта рекуррента d[i] = (fib[i] * fib[i-1] + d[i-1]) % MOD;

Mar 11th, 2025
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define LU [0][0]
  5. constexpr int MOD = 1e9+7;
  6. vector<vector<int>> M(1000, vector<int>(1000));
  7. ostream& operator<<(ostream& out, const vector<vector<int>>& mat) {
  8.     for (const auto &x : mat) {
  9.         for (const auto &y : x) {
  10.             out << y << " ";
  11.         }out << "\n";
  12.     }
  13.     return out;
  14. }
  15. void operator*=(vector<vector<int>> &a, const vector<vector<int>>& b) {
  16. //    cout << a;
  17. //    cout << "XXX\n";
  18. //    cout << b;
  19.     for (auto &x : a) {
  20.         assert(x.size() == a[0].size());
  21.     }
  22.     for (auto &y : b) {
  23.         assert(y.size() == b[0].size());
  24.     }
  25.     int skal_size = a[0].size();
  26.     assert(a[0].size() == b.size());
  27.     for (int i = 0; i < a.size(); i += 1) {
  28.         for (int j = 0; j < b[0].size(); j += 1) {
  29.             M[i][j] = 0;
  30.             for (int k = 0; k < skal_size; k += 1) {
  31.                 M[i][j] += a[i][k] * b[k][j] % MOD;
  32.             }
  33.             M[i][j] %= MOD;
  34.         }
  35.     }
  36.     for (auto &x : a) {
  37.         x.resize(b[0].size());
  38.     }
  39.     for (int i = 0; i < a.size(); i += 1) {
  40.         for (int j = 0; j < a[i].size(); j += 1) {
  41.             a[i][j] = M[i][j];
  42.         }
  43.     }
  44. }
  45. void operator^=(vector<vector<int>>& mat, int b) {
  46.     assert(b >= 0);
  47.     assert(mat.size() == mat[0].size());
  48.     vector<vector<int>> ret(mat.size(), vector<int>(mat.size()));
  49.     for (int i = 0; i < mat.size(); i += 1) {
  50.         ret[i][i] = 1;
  51.     }
  52.     while (b) {
  53.         if (b&1) {
  54.             ret *= mat;
  55.         }
  56.         mat *= mat;
  57.         b >>= 1;
  58.     }
  59.     mat = ret;
  60. }
  61. signed main() {
  62.     vector<vector<int>> oper = {
  63.             {2, 1, 0, -1+MOD},
  64.             {2, 1, 1, -2+MOD},
  65.             {0, 1, 0, 0},
  66.             {1, 0, 0, 0}
  67.     };
  68.     int n;
  69.     cin >> n;
  70.     if (n == 0) {
  71.         assert(false);
  72.     }
  73.     oper ^= n-1;
  74.     vector<vector<int>> base = {
  75.             {0},
  76.             {1},
  77.             {0},
  78.             {0}
  79.     };
  80.     oper *= base;
  81.     int fast_ans = oper LU;
  82.     vector<int> fib(n+1);
  83.     vector<int> d(n+1);
  84.     fib[0] = 0;
  85.     fib[1] = 1;
  86.     for (int i = 2; i <= n; i += 1) {
  87.         fib[i] = (fib[i-1] + fib[i-2]) % MOD;
  88.         d[i] = (fib[i] * fib[i-1] + d[i-1]) % MOD;
  89.     }
  90.     cout << "d[n] = " << d[n] << "\n";
  91.     cout << fast_ans << "\n";
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement