int n, m, k; int deg[kMaxN], val[kMaxM], tm[kMaxK]; i64 res[kMaxK]; std::vector<std::pair<int, int>> G[kMaxN]; std::mt19937_64 rnd(std::random_device{}());
intqpow(int bs, int64_t idx = kMod - 2){ int ret = 1; for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod) if (idx & 1) ret = (int64_t)ret * bs % kMod; return ret; }
inlineintadd(int x, int y){ return (x + y >= kMod ? x + y - kMod : x + y); } inlineintsub(int x, int y){ return (x >= y ? x - y : x - y + kMod); } inlinevoidinc(int &x, int y){ (x += y) >= kMod ? x -= kMod : x; } inlinevoiddec(int &x, int y){ (x -= y) < 0 ? x += kMod : x; }
structVector { int a[kMaxK] = {0}; friend Vector operator *(const Vector &b, constint w) { static Vector ret; for (int i = 1; i <= k; ++i) ret.a[i] = 1ll * w * b.a[i] % kMod; return ret; } friend Vector operator +(const Vector &a, const Vector &b) { static Vector ret; for (int i = 1; i <= k; ++i) ret.a[i] = add(a.a[i], b.a[i]); return ret; } } f[kMaxN], bs[kMaxK];
voidprework(){ std::queue<int> q; for (int i = 1; i <= n; ++i) { if (!deg[i]) q.emplace(i); if (i <= k) f[i].a[i] = 1; } for (; !q.empty();) { int u = q.front(); q.pop(); for (auto [v, id] : G[u]) { f[v] = f[v] + f[u] * val[id]; if (!--deg[v]) q.emplace(v); } } }
voidins(Vector a, int t){ for (int i = 1; i <= k; ++i) { if (a.a[i]) { if (t > tm[i]) std::swap(a, bs[i]), std::swap(t, tm[i]); int v = 1ll * a.a[i] * qpow(bs[i].a[i]) % kMod; a = a + bs[i] * sub(0, v); } } }
voiddickdreamer(){ std::cin >> n >> m >> k; for (int i = 1; i <= m; ++i) { int u, v; std::cin >> u >> v; G[u].emplace_back(v, i), ++deg[v], val[i] = rnd() % kMod; } prework(); for (int i = k + 1; i <= n; ++i) { staticint tt[kMaxK]; ins(f[i], i); if (i > k) { for (int j = 1; j <= k; ++j) tt[j] = tm[j]; tt[0] = i; std::sort(tt + 1, tt + 1 + k, std::greater<>()); for (int j = 0; j <= k; ++j) if (tt[j]) res[j] += tt[j] - k; } } for (int i = 0; i < k; ++i) res[i] -= res[i + 1]; for (int i = 0; i <= k; ++i) std::cout << res[i] << '\n'; }