Advertisement
Guest User

mooriokart.cpp

a guest
Feb 26th, 2019
274
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int mod = 1e9 + 7, two = (mod + 1) / 2;
  6.  
  7. int pw(int x, int y) {
  8.     int r = 1;
  9.     while (y) {
  10.         if (y & 1) r = 1ll * r * x % mod;
  11.         x = 1ll * x * x % mod;
  12.         y >>= 1;
  13.     }
  14.     return r;
  15. }
  16. int inv(int x) { return pw(x, mod - 2); }
  17.  
  18. int n, m, x, y;
  19. vector <pair <int, int> > adj[1505];
  20. int a[1505][2505];
  21. int d[1505];
  22. int tot[1505];
  23. vector <int> f;
  24.  
  25. int dad[1505], sz[1505];
  26. int anc(int u) { return dad[u] == u ? u : dad[u] = anc(dad[u]); }
  27.  
  28. int main(void) {
  29.     freopen("mooriokart.in", "r", stdin);
  30.     freopen("mooriokart.out", "w", stdout);
  31.     ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
  32.     cin >> n >> m >> x >> y;
  33.     int cc = n - m;
  34.     y = max(0, y - x * cc);
  35.     for (int i = 1; i <= n; ++i) dad[i] = i, sz[i] = 1;
  36.     for (int i = 1; i <= m; ++i) {
  37.         int u, v, w;
  38.         cin >> u >> v >> w;
  39.         adj[u].push_back(make_pair(v, w));
  40.         adj[v].push_back(make_pair(u, w));
  41.         u = anc(u), v = anc(v);
  42.         dad[v] = u;
  43.         sz[u] += sz[v];
  44.         sz[v] = 0;
  45.     }
  46.     for (int i = 1; i <= n; ++i) {
  47.         int id = anc(i);
  48.         memset(d, -1, sizeof d);
  49.         queue <int> q;
  50.         d[i] = 0;
  51.         q.push(i);
  52.         while (!q.empty()) {
  53.             int u = q.front(); q.pop();
  54.             for (auto z: adj[u]) {
  55.                 int v = z.first, w = z.second;
  56.                 if (~d[v]) continue;
  57.                 d[v] = d[u] + w;
  58.                 tot[id] = (tot[id] + d[v]) % mod;
  59.                 if (d[v] < y) ++a[id][d[v]];
  60.                 q.push(v);
  61.             }
  62.         }
  63.     }
  64.  
  65.     //f = a[1] * a[2] * ... * a[n], where a[i] are polynomials
  66.     //lmao brute force passes, NA LUL
  67.     f.assign(y + 1, 0);
  68.     f[0] = 1;
  69.     for (int i = 1; i <= n; ++i) if (dad[i] == i) {
  70.         vector <int> g(y + 1, 0);
  71.         for (int u = 0; u < y; ++u) for (int v = 0; u + v < y; ++v)
  72.             g[u + v] = (g[u + v] + 1ll * f[u] * a[i][v]) % mod;
  73.         f.swap(g);
  74.     }
  75.  
  76.     int all = 0;
  77.     int ways = 1;
  78.     for (int i = 1; i <= n; ++i) if (dad[i] == i) ways = 1ll * ways * sz[i] % mod * (sz[i] - 1) % mod;
  79.     all = (all + 1ll * x * cc * ways) % mod;
  80.     for (int i = 1; i <= n; ++i) if (dad[i] == i) {
  81.         int ways_i = 1ll * sz[i] * (sz[i] - 1) % mod;
  82.         all = (all + 1ll * tot[i] * ways % mod * inv(ways_i)) % mod;
  83.     }
  84.     int coef = two;
  85.     for (int i = 1; i < cc; ++i) coef = 1ll * coef * i % mod;
  86.     int ans = 0;
  87.     for (int i = 1; i < y; ++i) ans = (ans + 1ll * f[i] * (i + x * cc)) % mod;
  88.     ans = 1ll * (all - ans + mod) * coef % mod;
  89.     cout << ans << endl;
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement