結果
| 問題 |
No.2990 Interval XOR
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-22 08:53:39 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 458 ms / 2,000 ms |
| コード長 | 2,894 bytes |
| コンパイル時間 | 2,159 ms |
| コンパイル使用メモリ | 194,684 KB |
| 実行使用メモリ | 45,952 KB |
| 最終ジャッジ日時 | 2025-04-22 08:53:54 |
| 合計ジャッジ時間 | 13,345 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 |
コンパイルメッセージ
main.cpp: In function ‘void solve()’:
main.cpp:57:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
57 | scanf("%lld%lld", &m, &n);
| ~~~~~^~~~~~~~~~~~~~~~~~~~
main.cpp:59:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
59 | scanf("%lld%lld", &e[i].l, &e[i].r);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;
const int maxn = (1 << 20) + 50;
const ll mod = 998244353;
const ll inv2 = (mod + 1) / 2;
ll n, m, a[maxn], b[maxn], c[maxn], d[maxn], suf[maxn], ans[maxn], f[maxn][2];
ll ca[maxn], cb[maxn];
struct node {
ll l, r;
} e[maxn];
inline void iFWT(ll *a) {
for (int k = 1; k < (1 << m); k <<= 1) {
for (int i = 0; i < (1 << m); i += (k << 1)) {
for (int j = 0; j < k; ++j) {
ll x = a[i + j], y = a[i + j + k];
a[i + j] = (x + y < mod ? x + y : x + y - mod) * inv2 % mod;
a[i + j + k] = (x < y ? x - y + mod : x - y) * inv2 % mod;
}
}
}
}
void dfs(int l, int r) {
if (l == r) {
f[l][0] = ca[l];
f[l][1] = (__builtin_parity(l) ? mod - cb[l] : cb[l]) % mod;
return;
}
int mid = (l + r) >> 1;
dfs(l, mid);
dfs(mid + 1, r);
for (int i = l, j = mid + 1; i <= mid; ++i, ++j) {
ll xa = f[i][0], xb = f[i][1], ya = f[j][0], yb = f[j][1];
f[i][0] = (xa * ya - xb * yb % mod + mod) % mod;
f[i][1] = (xb * ya - xa * yb % mod + mod) % mod;
f[j][0] = (ya * xa + yb * xb) % mod;
f[j][1] = (ya * xb + yb * xa) % mod;
}
}
void solve() {
scanf("%lld%lld", &m, &n);
for (int i = 1; i <= n; ++i) {
scanf("%lld%lld", &e[i].l, &e[i].r);
}
for (int i = 0; i < (1 << m); ++i) {
ans[i] = 0;
}
for (int p = 0; p < m; ++p) {
suf[(1 << m)] = 0;
for (int i = (1 << m) - 1; ~i; --i) {
suf[i] = suf[i + 1] + ((i & (1 << p)) ? -1 : 1);
}
ll x = 0;
for (int i = 1; i <= n; ++i) {
a[i] = suf[(e[i].r >> (p + 1)) << (p + 1)] - suf[e[i].r + 1];
c[i] = e[i].r >> (p + 1);
if (e[i].l) {
b[i] = (mod - suf[((e[i].l - 1) >> (p + 1)) << (p + 1)] + suf[e[i].l]) % mod;
d[i] = (e[i].l - 1) >> (p + 1);
} else {
b[i] = d[i] = 0;
}
x ^= c[i];
}
for (int i = 0; i < (1 << (m - 1 - p)); ++i) {
ca[i] = 1;
cb[i] = 0;
}
for (int i = 1; i <= n; ++i) {
ll y = c[i] ^ d[i];
ll a1 = ca[y], b1 = cb[y], a2 = a[i], b2 = b[i];
ca[y] = (a1 * a2 + b1 * b2) % mod;
cb[y] = (a1 * b2 + a2 * b1) % mod;
}
dfs(0, (1 << (m - 1 - p)) - 1);
for (int i = 0; i < (1 << (m - 1 - p)); ++i) {
if (__builtin_parity(i & x)) {
f[i][0] = (mod - f[i][0]) % mod;
f[i][1] = (mod - f[i][1]) % mod;
}
}
for (int i = 0; i < (1 << m); ++i) {
if (__lg(i & (-i)) == p) {
ans[i] = (ans[i] + f[i >> (p + 1)][0] + f[i >> (p + 1)][1]) % mod;
}
}
}
ans[0] = 1;
for (int i = 1; i <= n; ++i) {
ans[0] = ans[0] * (e[i].r - e[i].l + 1) % mod;
}
iFWT(ans);
for (int i = 0; i < (1 << m); ++i) {
printf("%lld\n", ans[i]);
}
}
int main() {
int T = 1;
// scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}