Advertisement
wym1111

Untitled

Aug 10th, 2024
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. #define int long long
  5.  
  6. const ll mod = 1e9 + 7;
  7.  
  8. struct Matrix {
  9.     int n, m;
  10.     vector<vector<ll>> a;
  11.    
  12.     void build(int n, int m) {
  13.         a.assign(n + 1, vector<ll>(m + 1, 0));
  14.         this->n = n, this->m = m;
  15.     }
  16.    
  17.     void I() {
  18.         for(int i = 1; i <= n; i++) {
  19.             for(int j = 1; j <= n; j++) {
  20.                 a[i][j] = 0;
  21.             }
  22.             a[i][i] = 1;
  23.         }
  24.     }
  25.    
  26.     Matrix Multi(Matrix mtx) {
  27.         int n = this->n, m = mtx.m;
  28.         int mid = this->m;
  29.         Matrix ans;
  30.         ans.build(n, m);
  31.         for(int i = 1; i <= n; i++) {
  32.             for(int j = 1; j <= m; j++) {
  33.                 for(int k = 1; k <= mid; k++) {
  34.                     ans.a[i][j] += this->a[i][k] * mtx.a[k][j] % mod;
  35.                     ans.a[i][j] %= mod;
  36.                 }
  37.             }
  38.         }
  39.         return ans;
  40.     }
  41.    
  42.     Matrix Add(Matrix& mtx) {
  43.         int n = this->n, m = this->m;
  44.         Matrix ans;
  45.         ans.build(n, m);
  46.         for(int i = 1; i <= n; i++) {
  47.             for(int j = 1; j <= m; j++) {
  48.                 // cout << i << ' ' << j << endl;
  49.                 ans.a[i][j] = (this->a[i][j] + mtx.a[i][j]) % mod;
  50.             }
  51.         }
  52.         // ans.print();
  53.         return ans;
  54.     }
  55.    
  56.     Matrix Sub(Matrix& mtx) {
  57.         int n = this->n, m = this->m;
  58.         Matrix ans;
  59.         ans.build(n, m);
  60.         for(int i = 1; i <= n; i++) {
  61.             for(int j = 1; j <= m; j++) {
  62.                 ans.a[i][j] = (this->a[i][j] - mtx.a[i][j] + mod) % mod;
  63.             }
  64.         }
  65.         return ans;
  66.     }
  67.    
  68.     void print() {
  69.         cout << n << ' ' << m << endl;
  70.         for(int i = 1; i <= n; i++) {
  71.             for(int j = 1; j <= m; j++) {
  72.                 cout << a[i][j] << ' ';
  73.             }
  74.             cout << endl;
  75.         }
  76.     }
  77.    
  78.     void Clear() {
  79.         for(int i = 1; i <= n; i++) {
  80.             for(int j = 1; j <= m; j++) {
  81.                 a[i][j] = 0;
  82.             }
  83.         }
  84.     }
  85. } W, DP, L, R, S[70];
  86.  
  87. int n, m;
  88. ll l, r;
  89.  
  90. Matrix qpow(Matrix& w, int t)
  91. {
  92.     int n = w.n;
  93.     Matrix ans;
  94.     ans.build(n, n);
  95.     ans.I();
  96.     Matrix base = w;
  97.     // base.print();ans.print();
  98.     while(t) {
  99.         if(t & 1) {
  100.             ans = ans.Multi(base);
  101.             // ans.print();
  102.         }
  103.         base = base.Multi(base);
  104.         t >>= 1;
  105.     }
  106.     // ans.print();
  107.     return ans;
  108. }
  109.  
  110. Matrix A, B, W;
  111. void init() {
  112.     cin >> n >> m >> l >> r;
  113.     W.build(n, n);
  114.     B.build(n, n);
  115.     for (int i = 1; i <= m; i ++) {
  116.         int u, v, w;
  117.         cin >> u >> v >> w;
  118.         if (v > n) {
  119.             B.a[u][v - n] = w;
  120.         } else {
  121.             W.a[u][v] = w;
  122.         }
  123.     }
  124.     A.build(n, n);
  125.     A.I();
  126.     for (int i = 1; i <= n; i ++) {
  127.         A = A.Add(W);
  128.         W = W.Multi(W);
  129.     }
  130. }
  131.  
  132. void dfs(ll x, Matrix& m, ll pos)
  133. {
  134.     if(x == 0) return;
  135.     ll k = pow(2ll, pos);
  136.     // cout << k << endl;
  137.     while(x < k) {
  138.         k /= 2;
  139.         pos -= 1;
  140.     }
  141.     // cout << x << ' ' << k << endl;
  142.     dfs(x - k, m, pos);
  143.     m = (m.Multi(qpow(W, k))).Add(S[pos]);
  144.     // cout << x - k << endl;
  145.     // m.print();
  146. }
  147.  
  148. void solve()
  149. {
  150.     init();
  151.    
  152. }
  153.  
  154. signed main() {
  155.     // ios::sync_with_stdio(false);
  156.     // cin.tie(nullptr);
  157.     // cout.tie(nullptr);
  158.     ll t;
  159.     cin >> t;
  160.     while(t--)
  161.         solve();
  162.     return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement