Advertisement
MiinaMagdy

10870 - Recurrences

Jan 27th, 2024
921
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. /*
  2. +---------------------------------------------+
  3. |                                             |
  4. |       © 28/01/2024 (00:46) MinaMagdy        |
  5. |                                             |
  6. +---------------------------------------------+
  7. */
  8. #include <bits/stdc++.h>
  9. #include <ext/pb_ds/assoc_container.hpp>
  10. #include <ext/pb_ds/tree_policy.hpp>
  11.  
  12. using namespace std;
  13. using namespace __gnu_pbds;
  14. #define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
  15. #define multi_ordered_set tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update>
  16. #define endl "\n"
  17. #define MOD 1000000007
  18. #define INF 2000000000
  19. #define all(s) s.begin(), s.end()
  20. #define rall(s) s.rbegin(), s.rend()
  21. #define sz(x) int(x.size())
  22.  
  23. typedef long long ll;
  24. typedef long double ld;
  25. typedef unsigned long long ull;
  26. #include <ext/numeric>
  27. using namespace __gnu_cxx;
  28. typedef vector<vector<int>> matrix;
  29. int mod;
  30. struct mul
  31. {
  32.     int n;
  33.     mul(int n) : n(n) {}
  34.     matrix operator()(const matrix &a, const matrix &b)
  35.     {
  36.         matrix c(n, vector<int>(n, 0));
  37.         for (int i = 0; i < n; i++)
  38.         {
  39.             for (int j = 0; j < n; j++)
  40.             {
  41.                 for (int k = 0; k < n; k++)
  42.                 {
  43.                     c[i][j] += a[i][k] * 1ll * b[k][j] % mod;
  44.                     if (c[i][j] >= mod)
  45.                         c[i][j] -= mod;
  46.                 }
  47.             }
  48.         }
  49.         return c;
  50.     }
  51. };
  52.  
  53. matrix identity_element(const mul &m)
  54. {
  55.     matrix res(m.n, vector<int>(m.n, 0));
  56.     for (int i = 0; i < m.n; i++)
  57.         res[i][i] = 1;
  58.     return res;
  59. }
  60.  
  61. void solve()
  62. {
  63.     int d, n, m;
  64.     while (cin >> d >> n >> m, d || n || m)
  65.     {
  66.         mod = m;
  67.         matrix t(d, vector<int>(d));
  68.         for (int i = 0; i < d; i++)
  69.         {
  70.             if (i != d - 1)
  71.                 t[i][i + 1] = 1;
  72.             cin >> t[d - 1][d - i - 1];
  73.         }
  74.         matrix f1(d, vector<int>(1));
  75.         for (int i = 0; i < d; i++)
  76.         {
  77.             cin >> f1[i][0];
  78.         }
  79.         mul mm(d);
  80.         matrix ret = mm(power(t, n - 1, mm), f1);
  81.         cout << ret[0][0] << endl;
  82.     }
  83. }
  84.  
  85. int main(void)
  86. {
  87.     ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
  88.     int testcase = 1;
  89.     // cin >> testcase;
  90.     while (testcase--)
  91.         solve();
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement