usingnamespacestd; typedeflonglong LL; #define int long long
constint MAXN = 3E5 + 5; constint MOD = 998244353;
vector<int> v; unordered_map<int, int> mp; int n, a[MAXN];
voiddesc(){ sort(v.begin(), v.end()); int m = unique(v.begin(), v.end()) - v.begin(); for (int i = 0; i < m; i++) mp[v[i]] = i + 1; }
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; }
structBIT {// Binary Index Trees, 1based intlowbit(int x){ return x & (~x + 1); } /* O(n) build tree*/ BIT() { for (int i = 1; i <= n; i++) c[i] = 0; } voidbuild(){ for (int i = 1; i <= n; i++) { int j = i + lowbit(i); // j is father of i if (j <= n) c[j] += c[i]; } } /*@param x the position to add val*/ voidadd(int x, LL val){ val %= MOD; while (x <= n) (c[x] += val) %= MOD, x += lowbit(x); } /*range [1, x] sum query*/ LL query(int x, LL res = 0){ while (x) (res += c[x]) %= MOD, x -= lowbit(x); return res; } array<LL, MAXN> c; } bit[3]; /*range [l, r] add val*/ inlinevoidadd(int l, int r, LL val){ bit[1].add(l, val), bit[1].add(r + 1, -val); bit[2].add(l, val * l), bit[2].add(r + 1, -val * (r + 1)); } /*range [l, r] sum query*/ inline LL query(int l, int r, LL res = 0){ res = (bit[0].query(r) + bit[1].query(r) * (r + 1) % MOD - bit[2].query(r)) % MOD; res %= MOD; res -= (bit[0].query(l - 1) + bit[1].query(l - 1) * l % MOD - bit[2].query(l - 1)) % MOD; return (res % MOD + MOD) % MOD; }
signedmain(){ ios::sync_with_stdio(false); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i], v.push_back(a[i]); desc(); int ans = 0; for (int i = 1; i <= n; i++) { int id = mp[a[i]]; ans = (ans + query(1, id) * qpow(2, i - 1, MOD) % MOD) % MOD; add(id, id, qpow(qpow(2, i, MOD), MOD - 2, MOD)); } cout << ans; return0; }
intgetNode(int ed, int d){ while (d) ed = pre[ed], d--; return ed; }
intdfs2(int now, int fa, int d){ // 求到 now 距离为 d 的点的个数 if (!d) return1; int ans = 0; for (auto &to : G[now]) { if (to == fa) continue; ans += dfs2(to, now, d - 1); } return ans; }
signedmain(){ ios::sync_with_stdio(false); cin >> n; for (int i = 1, u, v; i < n; i++) { cin >> u >> v; G[u].push_back(v), G[v].push_back(u); } getDia(); if (D % 2 == 0) { int center = getNode(ed, D / 2); vector<int> v; for (auto &to : G[center]) v.push_back(dfs2(to, center, D / 2 - 1)); LL tmp = 1; for (auto &sz : v) tmp = tmp * (sz + 1) % MOD; tmp--; for (auto &sz : v) tmp -= sz; cout << (tmp % MOD + MOD) % MOD; } else { int a = getNode(ed, (D - 1) / 2); int b = getNode(ed, (D + 1) / 2); int m1 = dfs2(a, b, D / 2); int m2 = dfs2(b, a, D / 2); cout << 1ll * m1 * m2 % MOD; } return0; }
constint MAXN = 5E3 + 5; constint MOD = 998244353; int n, m; LL dp[MAXN][MAXN], sum[MAXN][MAXN], tmp[MAXN];
signedmain(){ cin >> n >> m; for (int i = 1; i <= n; i++) { if (i <= m) for (int s = i; s <= n; s += i) dp[i][s] = 1; for (int s = 0, j = i - m; s <= n; s++) tmp[s] = ((s >= i ? tmp[s - i] : 0) + sum[i - 1][s] - (j > 0 ? sum[j - 1][s] : 0)) % MOD; for (int s = i; s <= n; s++) dp[i][s] = (dp[i][s] + tmp[s - i]) % MOD; for (int s = 0; s <= n; s++) sum[i][s] = (sum[i - 1][s] + dp[i][s]) % MOD; } for (int i = 1; i <= n; i++) cout << (dp[i][n] + MOD) % MOD << '\n'; return0; }