#include <bits/stdc++.h> #define ll long long #define mp make_pair #define fi first #define se second #define pb push_back #define vi vector<int> #define pi pair<int, int> #define mod 998244353 template<typename T> bool chkmin(T &a, T b){return (b < a) ? a = b, 1 : 0;} template<typename T> bool chkmax(T &a, T b){return (b > a) ? a = b, 1 : 0;} ll ksm(ll a, ll b) {if (b == 0) return 1; ll ns = ksm(a, b >> 1); ns = ns * ns % mod; if (b & 1) ns = ns * a % mod; return ns;} using namespace std; const int maxn = 100005; const int maxk = 55; mt19937 rd; int grd(int l, int r) { return rd() % (r - l + 1) + l; } #define vec array<int, maxk> struct bin { vec a[maxk]; ll inv[maxk]; int rk; bin() { rk = 0; } bool ins(vec x) { for (int i = 0; i < maxk; i++) if (x[i]) { if (!a[i][i]) { a[i] = x; inv[i] = ksm(x[i], mod - 2); rk += 1; return 1; } else { ll bk = x[i] * inv[i] % mod; for (int j = i; j < maxk; j++) x[j] = (x[j] - a[i][j] * bk) % mod; } } return 0; } }r[maxk]; int pl[maxk]; vi eg[maxn]; vec cur[maxn]; int fl[maxn]; ll ans[maxk]; void cal(int a) { if (fl[a]) return ; fl[a] = 1; for (int i = 0; i < maxk; i++) cur[a][i] = 0; for (auto v : eg[a]) { cal(v); ll t = grd(1, mod - 1); for (int i = 0; i < maxk; i++) cur[a][i] = (cur[a][i] + t * cur[v][i]) % mod; } } int main() { int n, m, k; cin >> n >> m >> k; for (int i = 1; i <= k; i++) for (int j = 0; j < maxk; j++) cur[i][j] = grd(1, mod - 1), fl[i] = 1; for (int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); eg[v].pb(u); } for (int i = 1; i <= n; i++) cal(i); for (int i = 0; i < maxk; i++) pl[i] = k; int cnt = 1; for (int i = k + 1; i <= n; i++) { for (int j = cnt - 1; j >= 0; j--) { if (j == cnt - 1) pl[j] = i; int cr = r[j].ins(cur[i]); if (!cr) { for (int u = j; u < cnt; u++) r[u] = r[u + 1], pl[u] = pl[u + 1]; cnt -= 1; break; } } for (int m = 0; m < cnt; m++) { int ls = k; if (m) ls = pl[m - 1]; ans[r[m].rk] += pl[m] - ls; } int ff = k; if (cnt) ff = pl[cnt - 1]; ans[0] += i - ff; for (int j = cnt; j < maxk; j++) pl[j] = k; r[cnt] = r[cnt + 1]; cnt += 1; } for (int i = 0; i <= k; i++) cout << ans[i] << endl; return (0-0); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #include <bits/stdc++.h> #define ll long long #define mp make_pair #define fi first #define se second #define pb push_back #define vi vector<int> #define pi pair<int, int> #define mod 998244353 template<typename T> bool chkmin(T &a, T b){return (b < a) ? a = b, 1 : 0;} template<typename T> bool chkmax(T &a, T b){return (b > a) ? a = b, 1 : 0;} ll ksm(ll a, ll b) {if (b == 0) return 1; ll ns = ksm(a, b >> 1); ns = ns * ns % mod; if (b & 1) ns = ns * a % mod; return ns;} using namespace std; const int maxn = 100005; const int maxk = 55; mt19937 rd; int grd(int l, int r) { return rd() % (r - l + 1) + l; } #define vec array<int, maxk> struct bin { vec a[maxk]; ll inv[maxk]; int rk; bin() { rk = 0; } bool ins(vec x) { for (int i = 0; i < maxk; i++) if (x[i]) { if (!a[i][i]) { a[i] = x; inv[i] = ksm(x[i], mod - 2); rk += 1; return 1; } else { ll bk = x[i] * inv[i] % mod; for (int j = i; j < maxk; j++) x[j] = (x[j] - a[i][j] * bk) % mod; } } return 0; } }r[maxk]; int pl[maxk]; vi eg[maxn]; vec cur[maxn]; int fl[maxn]; ll ans[maxk]; void cal(int a) { if (fl[a]) return ; fl[a] = 1; for (int i = 0; i < maxk; i++) cur[a][i] = 0; for (auto v : eg[a]) { cal(v); ll t = grd(1, mod - 1); for (int i = 0; i < maxk; i++) cur[a][i] = (cur[a][i] + t * cur[v][i]) % mod; } } int main() { int n, m, k; cin >> n >> m >> k; for (int i = 1; i <= k; i++) for (int j = 0; j < maxk; j++) cur[i][j] = grd(1, mod - 1), fl[i] = 1; for (int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); eg[v].pb(u); } for (int i = 1; i <= n; i++) cal(i); for (int i = 0; i < maxk; i++) pl[i] = k; int cnt = 1; for (int i = k + 1; i <= n; i++) { for (int j = cnt - 1; j >= 0; j--) { if (j == cnt - 1) pl[j] = i; int cr = r[j].ins(cur[i]); if (!cr) { for (int u = j; u < cnt; u++) r[u] = r[u + 1], pl[u] = pl[u + 1]; cnt -= 1; break; } } for (int m = 0; m < cnt; m++) { int ls = k; if (m) ls = pl[m - 1]; ans[r[m].rk] += pl[m] - ls; } int ff = k; if (cnt) ff = pl[cnt - 1]; ans[0] += i - ff; for (int j = cnt; j < maxk; j++) pl[j] = k; r[cnt] = r[cnt + 1]; cnt += 1; } for (int i = 0; i <= k; i++) cout << ans[i] << endl; return (0-0); } |