結果
| 問題 |
No.1689 Set Cards
|
| コンテスト | |
| ユーザー |
zawakasu
|
| 提出日時 | 2022-08-28 03:40:02 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 108 ms / 2,000 ms |
| コード長 | 3,091 bytes |
| コンパイル時間 | 10,299 ms |
| コンパイル使用メモリ | 278,444 KB |
| 最終ジャッジ日時 | 2025-01-31 06:36:31 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#define all(x) begin(x), end(x)
using namespace std;
using i32 = int;
using i64 = long long;
using ld = long double;
template <typename T1, typename T2>
inline bool chmax(T1 &a, T2 b) {return a < b and (a = b, true);}
template <typename T1, typename T2>
inline bool chmin(T1 &a, T2 b) {return a > b and (a = b, true);}
const i64 supl = LONG_LONG_MAX / 2 - 100;
const i32 supi = INT_MAX / 2 - 100;
namespace zawa {
template<long long mod>
class modint {
private:
long long x;
public:
modint() : x(0) {}
modint(long long x) : x((x % mod + mod) % mod) {}
modint& operator+=(modint p) {
x += p.x;
if (x >= mod) x -= mod;
return *this;
}
modint& operator-=(modint p) {
x += mod - p.x;
if (x >= mod) x -= mod;
return *this;
}
modint& operator*=(modint p) {
x = (1LL * x * p.x % mod);
return *this;
}
modint& operator/=(modint p) {
*this *= p.inv();
return *this;
}
modint operator-() const {
return modint(-x);
}
modint operator+(const modint& p) const {
return modint(*this) += p;
}
modint operator-(const modint& p) const {
return modint(*this) -= p;
}
modint operator*(const modint& p) const {
return modint(*this) *= p;
}
modint operator/(const modint& p) const {
return modint(*this) /= p;
}
long long val() {
return x;
}
modint pow(long long p) {
modint res(1), val(x);
while(p) {
if (p & 1) res *= val;
val *= val;
p >>= 1;
}
return res;
}
modint inv() {
return pow(mod - 2);
}
};
}// namespace zawa
using mint = zawa::modint<998244353>;
void main_() {
i32 n; cin >> n;
vector<i32> as(n);
for (auto& a : as) {
i32 k; cin >> k;
for (i32 _ = 0 ; _ < k ; _++) {
i32 c; cin >> c;
c--;
a = a | (1 << c);
}
}
vector<mint> ps(n + 1, mint(1));
for (i32 i = 1 ; i <= n ; i++) ps[i] = ps[i - 1] * 2;
mint ans = ps[n] - 1;
for (i32 bit = 1 ; bit < (1 << 12) ; bit++) {
int cnt = 0;
for (i32 i = 0 ; i < n ; i++) {
bool ok = true;
for (i32 j = 0 ; j < 12 ; j++) {
if (!(bit & (1 << j))) continue;
if (!(as[i] & (1 << j))) ok = false;
}
if (ok) cnt++;
}
// cout << bit << ' ' << cnt << endl;
ans -= (__builtin_popcount(bit) & 1 ? ps[cnt] - 1 : -(ps[cnt] - 1));
}
cout << ans.val() << endl;
}
int main() {
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
main_();
return 0;
}
zawakasu