constint MAXN = 2E5 + 5; constint MOD = 1E9 + 7; int n; vector<int> G[MAXN], ans;
voiddfs(int now, int fa){ ans.push_back(now); for (auto& to : G[now]) { if (to == fa) continue; dfs(to, now); ans.push_back(now); } }
signedmain(){ ios::sync_with_stdio(false); cin >> n; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } for (int i = 1; i <= n; i++) sort(G[i].begin(), G[i].end()); dfs(1, 1); for (auto& v : ans) cout << v << " "; return0; }
voiddfs(int now){ staticint times = 0; in[now] = times++; for (auto& to : G[now]) { if (to == -1) continue; dfs(to); dp[now] += dp[to]; } out[now] = times; for (auto& to : G[now]) { if (to == -1) continue; update(in[to], out[to] - 1, 1ll * len[now] * (dp[now] - dp[to])); } update(in[now], in[now], 1ll * len[now] * dp[now]); }
voidcalcLCPs(){ for (int i = 1; i <= size; i++) if (link[i] != -1) G[link[i]].push_back(i); dfs(0); for (int i = 1; i <= size; i++) ans[i] += ans[i - 1]; } };
signedmain(){ ios::sync_with_stdio(false); cin >> n >> s; reverse(s.begin(), s.end()); SAM mySAM(s.size()); for (auto& c : s) mySAM.insert(c - 'a'); mySAM.calcLCPs(); for (int i = pre.size() - 1; ~i; i--) cout << ans[in[pre[i]]] << endl; return0; }
constint MAXN = 18; constint MAXS = (1 << 17) - 1; constint MOD = 998244353; int n, m; int u[MAXN * MAXN], v[MAXN * MAXN]; LL f[MAXS], g[MAXS];
LL qpow(LL a, LL b, LL MOD){ LL ans = 1, base = a % MOD; while (b) { if (b & 1) ans = ans * base % MOD; b >>= 1, base = base * base % MOD; } return ans; }
signedmain(){ ios::sync_with_stdio(false); cin >> n >> m; for (int i = 1; i <= m; i++) { cin >> u[i] >> v[i]; u[i]--, v[i]--; } for (int s = 0; s < (1 << n); s++) { int cnte = 0; for (int i = 1; i <= m; i++) if (((s >> u[i]) & 1) && ((s >> v[i]) & 1)) cnte++; g[s] = qpow(2, cnte, MOD); f[s] = g[s]; for (int t = s - 1; t > 0; t--) { t &= s; f[s] -= f[t] * (g[s - t] - (t > s - t ? f[s - t] : 0)) % MOD; f[s] %= MOD; } } for (int k = 1; k < n; k++) { int ans = 0; for (int s = 0; s < (1 << n); s++) { if ((s & 1) && ((s >> k) & 1)) { ans += f[s] * g[(1 << n) - 1 - s] % MOD; ans %= MOD; } } cout << (ans + MOD) % MOD << endl; } return0; }
namespace NTT { constexprint NR = 1 << 22, g = 3, gi = 332748118, mod = 998244353;
longlongqpow(longlong a, longlong b){ longlong res = 1; while (b) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; }
int R[4000001]; voidinit(int& sz){ if (__builtin_popcount(sz) != 1) sz = 1 << (1 + (int)log2(sz)); for (int i = 0; i < sz; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) ? (sz >> 1) : 0); }
voiddft(longlong a[], int sz, int type){ for (int i = 0; i < sz; i++) if (i < R[i]) swap(a[i], a[R[i]]); for (int m = 2; m <= sz; m <<= 1) { longlong gn = qpow(type == 1 ? g : gi, (mod - 1) / m); // 单位原根 g_n for (int k = 0; k < sz; k += m) { longlongg0(1); for (int j = 0; j < m / 2; j++) { longlong t = g0 * a[k + j + m / 2] % mod; longlong u = a[k + j]; a[k + j] = (u + t) % mod; a[k + j + m / 2] = (u - t + mod) % mod; g0 = g0 * gn % mod; } } } if (type == -1) { longlong inv = qpow(sz, mod - 2); for (int i = 0; i < sz; i++) a[i] = a[i] * inv % mod; } } }
namespace Polynomial { usingnamespace NTT;
voidConvolution(int n, int m, int a[], int b[], int c[]){ // a[0, n] b[0, m] int N = n + m + 1; init(N); longlong f[N], g[N]; for (int i = 0; i < N; i++) f[i] = g[i] = 0; for (int i = 0; i <= n; i++) f[i] = a[i]; for (int i = 0; i <= m; i++) g[i] = b[i]; dft(f, N, 1), dft(g, N, 1); longlong res[N]; for (int i = 0; i < N; i++) res[i] = 0; for (int i = 0; i < N; i++) res[i] = f[i] * g[i] % mod; dft(res, N, -1); for (int i = 0; i <= n + m; i++) c[i] = res[i]; } };
int n, m, t; int d[10][MAXN]; int p[10][10][MAXN]; vector<pair<int, int>> e;
usingnamespace Polynomial; voiddivide_and_conquer(int l, int r){ if (l == r) { if (!l) d[0][0] = 1; return ; } int mid = (l + r) >> 1; divide_and_conquer(l, mid);
for (auto& i : e) { int x = i.first, y = i.second; int f[mid - l + 1], g[r - l + 1], c[r - l + 1 + mid - l + 1]; for (int i = 0; i < mid - l + 1; i++) f[i] = d[x][i + l]; for (int i = 0; i < r - l + 1; i++) g[i] = p[x][y][i]; Convolution(mid - l, r - l, f, g, c); for (int i = mid + 1; i <= r; i++) d[y][i] = (d[y][i] + c[i - l]) % mod;
for (int i = 0; i < mid - l + 1; i++) f[i] = d[y][i + l]; Convolution(mid - l, r - l, f, g, c); for (int i = mid + 1; i <= r; i++) d[x][i] = (d[x][i] + c[i - l]) % mod; }
divide_and_conquer(mid + 1, r); }
intmain(){ boost; cin >> n >> m >> t; for (int i = 1; i <= m; i++) { int a, b; cin >> a >> b, a--, b--; e.push_back({a, b}); for (int j = 1; j <= t; j++) cin >> p[a][b][j]; } divide_and_conquer(0, t); cout << d[0][t] << "\n"; return0; }