int n, m, k; int u[kMaxM], v[kMaxM], deg[kMaxN], res[kMaxN]; std::vector<int> G[kMaxN], rG[kMaxN]; std::mt19937 rnd(std::random_device{}()); std::uniform_int_distribution<> gen(0, kMod - 1);
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]; voidclear(){ std::fill_n(a + 1, k, 0); } friend Vector operator *(Vector a, int v) { for (int i = 1; i <= k; ++i) a.a[i] = 1ll * v * a.a[i] % kMod; return a; } friend Vector operator +(Vector a, Vector b) { for (int i = 1; i <= k; ++i) a.a[i] = add(a.a[i], b.a[i]); return a; } friend Vector operator -(Vector a, Vector b) { for (int i = 1; i <= k; ++i) a.a[i] = sub(a.a[i], b.a[i]); return a; } } f[kMaxM];
structBase { int cnt; Vector a[kMaxK]; voidclear(){ cnt = 0; for (int i = 1; i <= k; ++i) a[i].clear(); } voidins(Vector x){ ++cnt; for (int i = 1; i <= k; ++i) { if (x.a[i]) { if (!a[i].a[i]) returnvoid(a[i] = x); int d = 1ll * x.a[i] * qpow(a[i].a[i]) % kMod; x = x - a[i] * d; } } --cnt; } } base;
voidtopo(){ std::queue<int> q; for (int i = 1; i <= n; ++i) if (!deg[i]) q.emplace(i); for (; !q.empty();) { int u = q.front(); q.pop(); base.clear(); if (u == 1) { for (int i = 1; i <= k; ++i) base.a[i].a[i] = 1; } else { for (auto i : rG[u]) base.ins(f[i]); res[u] = base.cnt; } for (auto id : G[u]) { int v = ::v[id]; for (int i = 1; i <= k; ++i) f[id] = f[id] + base.a[i] * gen(rnd); if (!--deg[v]) q.emplace(v); } } }
voiddickdreamer(){ std::cin >> n >> m >> k; for (int i = 1; i <= m; ++i) { std::cin >> u[i] >> v[i]; G[u[i]].emplace_back(i), rG[v[i]].emplace_back(i); ++deg[v[i]]; } topo(); for (int i = 2; i <= n; ++i) std::cout << res[i] << " \n"[i == n]; }