結果
| 問題 | No.3486 Draw a Rainbow |
| コンテスト | |
| ユーザー |
👑 AngrySadEight
|
| 提出日時 | 2025-12-25 02:17:11 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 96 ms / 4,000 ms |
| コード長 | 1,808 bytes |
| 記録 | |
| コンパイル時間 | 2,318 ms |
| コンパイル使用メモリ | 218,464 KB |
| 実行使用メモリ | 9,088 KB |
| 最終ジャッジ日時 | 2026-03-27 20:52:00 |
| 合計ジャッジ時間 | 3,127 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
static const long long MOD = 998244353;
long long modpow(long long a, long long e) {
long long r = 1 % MOD;
while (e) {
if (e & 1) r = r * a % MOD;
a = a * a % MOD;
e >>= 1;
}
return r;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M, L;
cin >> N >> M >> L;
vector<int> A(N), B(N);
for(int i = 0; i < N; i++){
cin >> A[i] >> B[i];
--A[i];
B[i] -= (M + 1); // coder 側を 0-index
}
vector<int> freqA(M, 0), freqB(L, 0);
vector<vector<int>> c(M, vector<int>(L, 0));
for(int i = 0; i < N; i++){
freqA[A[i]]++;
freqB[B[i]]++;
c[A[i]][B[i]]++;
}
// 2^k と逆元
vector<long long> pow2(N + 1), invpow2(N + 1);
for(int i = 0; i <= N; i++){
pow2[i] = modpow(2, i);
invpow2[i] = modpow(pow2[i], MOD - 2);
}
int SZ = 1 << M;
vector<int> sumA(SZ, 0);
for(int s = 1; s < SZ; s++){
int lb = __builtin_ctz(s);
sumA[s] = sumA[s ^ (1 << lb)] + freqA[lb];
}
long long ans = 0;
for(int mask = 0; mask < SZ; mask++){
int bits = __builtin_popcount(mask);
vector<int> t(L, 0);
for(int a = 0; a < M; a++){
if(mask & (1 << a)){
for(int b = 0; b < L; b++){
t[b] += c[a][b];
}
}
}
long long cur = pow2[N - sumA[mask]];
for(int b = 0; b < L; b++){
long long factor = (1 - pow2[t[b]] * invpow2[freqB[b]] % MOD + MOD) % MOD;
cur = cur * factor % MOD;
}
if(bits & 1) ans = (ans - cur + MOD) % MOD;
else ans = (ans + cur) % MOD;
}
cout << ans << "\n";
return 0;
}
AngrySadEight