Advertisement
wym1111

Untitled

Aug 10th, 2024
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 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. };
  86.  
  87. int n, m;
  88. ll l, r;
  89.  
  90. Matrix A, B, W, w[70], s[70];
  91.  
  92. void pre() {
  93.     w[0] = W;
  94.     s[0] = W;
  95.     for (int i = 1; i <= 60; i ++) {
  96.         w[i] = w[i - 1].Multi(w[i - 1]);
  97.         s[i] = s[i - 1].Add(s[i - 1].Multi(w[i - 1]));
  98.     }
  99. }
  100.  
  101. void init() {
  102.     cin >> n >> m >> l >> r;
  103.     W.build(n, n);
  104.     B.build(n, n);
  105.     for (int i = 1; i <= m; i ++) {
  106.         ll u, v, w;
  107.         cin >> u >> v >> w;
  108.         if (v > n) {
  109.             B.a[u][v - n] = w;
  110.         } else {
  111.             W.a[u][v] = w;
  112.         }
  113.     }
  114.     A.build(n, n);
  115.     A.I();
  116.     auto tmp = W;
  117.    
  118. //  W.print();
  119.     for (int i = 1; i <= n; i ++) {
  120.         A = A.Add(W);
  121.         W = W.Multi(tmp);
  122.     }
  123.     W = B.Multi(A);
  124.    
  125. //  A.print();
  126. //  B.print();
  127. //  W.print();
  128. }
  129.  
  130. ll cal (ll x) {
  131. //  cout << "cal: " << x << " *********************\n";
  132.     if (x == 0) return 0;
  133.     if (x <= n) {
  134.         Matrix res, res2;
  135.         res.build(1, n);
  136.         res.a[1][1] = 1;
  137.         res = res.Multi(A);
  138.         res2 = res.Multi(W);
  139.         ll ans = 0;
  140.         for (int i = 1; i <= x; i ++) {
  141.             if (i <= n) ans = (ans + res.a[1][i]) % mod;
  142.             else ans = (ans + res2.a[1][i - n]) % mod;
  143.         }
  144.         return ans;
  145.     }
  146.    
  147.     Matrix res;
  148.     res.build(1, n);
  149.     res.a[1][1] = 1;
  150.     res = res.Multi(A);
  151.     Matrix cur_w, cur_s;
  152.     cur_w.build(n, n);  cur_w.I();
  153.     cur_s.build(n, n);  cur_s.I();
  154.    
  155.     ll k = (x - 1) / n - 1;
  156.     for (int i = 0; i <= 60; i ++) {
  157.         if ((k >> i) & 1) {
  158.             cur_s = cur_s.Add(s[i].Multi(cur_w));
  159.             cur_w = cur_w.Multi(w[i]);
  160.         }
  161.     }
  162.     ll ans = 0;
  163.     auto res1 = res.Multi(cur_s);
  164.     for (int i = 1; i <= n; i ++) {
  165.         ans = (ans + res1.a[1][i]) % mod;
  166.     }
  167.     auto res2 = res.Multi(cur_w.Multi(W));
  168.     x = (x - 1) % n + 1;
  169.     for (int i = 1; i <= x; i ++) {
  170.         ans = (ans + res2.a[1][i]) % mod;
  171.     }
  172. //  cout << "ans: " << ans << endl;
  173.     return ans;
  174. }
  175.  
  176.  
  177. void solve() {
  178.     init();
  179.     pre();
  180.    
  181.     ll res1 = cal(l - 1), res2 = cal(r);
  182.     cout << (res2 - res1 + mod) % mod << endl;
  183. }
  184.  
  185. signed main() {
  186.     ios::sync_with_stdio(false);
  187.     cin.tie(nullptr);
  188.     cout.tie(nullptr);
  189.     ll t;
  190.     cin >> t;
  191.     while(t--)
  192.         solve();
  193.     return 0;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement