QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#487258 | #7679. Master of Both IV | yaoy | WA | 77ms | 45256kb | C++20 | 5.8kb | 2024-07-22 19:22:30 | 2024-07-22 19:22:31 |
Judging History
answer
#include <bits/stdc++.h>
using i64 = long long;
template<class T>
constexpr T power(T a, i64 b) {
T res {1};
for (; b; b /= 2, a *= a) {
if (b % 2) {
res *= a;
}
}
return res;
}
constexpr i64 mul(i64 a, i64 b, i64 p) {
i64 res = a * b - i64(1.L * a * b / p) * p;
res %= p;
if (res < 0) {
res += p;
}
return res;
}
template<i64 P>
struct MInt {
i64 x;
constexpr MInt() : x {0} {}
constexpr MInt(i64 x) : x {norm(x % getMod())} {}
static i64 Mod;
constexpr static i64 getMod() {
if (P > 0) {
return P;
} else {
return Mod;
}
}
static void setMod(i64 Mod_) {
Mod = Mod_;
}
constexpr i64 norm(i64 x) const {
if (x < 0) {
x += getMod();
}
if (x >= getMod()) {
x -= getMod();
}
return x;
}
constexpr i64 val() const {
return x;
}
constexpr MInt operator-() const {
MInt res;
res.x = norm(getMod() - x);
return res;
}
constexpr MInt inv() const {
return power(*this, getMod() - 2);
}
constexpr MInt &operator*=(MInt rhs) & {
if (getMod() < (1ULL << 31)) {
x = x * rhs.x % int(getMod());
} else {
x = mul(x, rhs.x, getMod());
}
return *this;
}
constexpr MInt &operator+=(MInt rhs) & {
x = norm(x + rhs.x);
return *this;
}
constexpr MInt &operator-=(MInt rhs) & {
x = norm(x - rhs.x);
return *this;
}
constexpr MInt &operator/=(MInt rhs) & {
return *this *= rhs.inv();
}
friend constexpr MInt operator*(MInt lhs, MInt rhs) {
MInt res = lhs;
res *= rhs;
return res;
}
friend constexpr MInt operator+(MInt lhs, MInt rhs) {
MInt res = lhs;
res += rhs;
return res;
}
friend constexpr MInt operator-(MInt lhs, MInt rhs) {
MInt res = lhs;
res -= rhs;
return res;
}
friend constexpr MInt operator/(MInt lhs, MInt rhs) {
MInt res = lhs;
res /= rhs;
return res;
}
friend constexpr std::istream &operator>>(std::istream &is, MInt &a) {
i64 v;
is >> v;
a = MInt(v);
return is;
}
friend constexpr std::ostream &operator<<(std::ostream &os, const MInt &a) {
return os << a.val();
}
friend constexpr bool operator==(MInt lhs, MInt rhs) {
return lhs.val() == rhs.val();
}
friend constexpr bool operator!=(MInt lhs, MInt rhs) {
return lhs.val() != rhs.val();
}
friend constexpr bool operator<(MInt lhs, MInt rhs) {
return lhs.val() < rhs.val();
}
};
template<>
i64 MInt<0>::Mod = 998244353;
constexpr int P = 998244353;
using Mint = MInt<P>;
const int B = 16 + 1;
struct LinearBasis {
int ex, m;
std::vector<i64> bit, b;
LinearBasis() {
std::vector<i64> t;
init(t);
}
template<class T>
LinearBasis(std::vector<T> &a) {
init(a);
}
template<class T>
void init(std::vector<T> &a) {
this->ex = 0;
bit.assign(B, 0);
for (auto &x : a) {
insert(x);
}
// build();
}
void build() {
b.clear();
for (int i = 0; i < B; i++) {
if (!bit[i]) {
continue;
}
b.emplace_back(bit[i]);
}
this->m = b.size();
}
bool insert(i64 x) {
for (int i = B - 1; i >= 0; i--) {
if (x >> i & 1) {
if (!bit[i]) {
bit[i] = x;
// build();
return true;
} else {
x ^= bit[i];
}
}
}
this->ex++;
return false;
}
i64 queryMin(i64 x) {
for (int i = B - 1; i >= 0; i--) {
x = std::min(x, bit[i] ^ x);
}
return x;
}
i64 queryMax(i64 x) {
for (int i = B - 1; i >= 0; i--) {
x = std::max(x, bit[i] ^ x);
}
return x;
}
i64 kth(i64 k) { // the kth smallest element in set
// multiset: k >> this->ex
if (this->ex > 0) {
k--;
}
if (k > (1LL << m) - 1) {
return -1;
}
i64 x = 0;
for (int i = m - 1; i >= 0; i--) {
if (k >> i & 1) {
x = std::max(x, x ^ b[i]);
} else {
x = std::min(x, x ^ b[i]);
}
}
return x;
}
};
const int N = 2E5 + 1;
Mint pw[N];
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
LinearBasis L0(a);
std::vector<int> cnt(n + 1);
for (int i = 0; i < n; i++) {
cnt[a[i]]++;
}
Mint ans = pw[L0.ex] - 1;
std::sort(a.begin(), a.end());
a.erase(std::unique(a.begin(), a.end()), a.end());
const int m = a.size();
const int mx = a.back();
std::vector<LinearBasis> L(mx + 1);
for (auto &x : a) {
for (int j = x; j <= mx; j += x) {
L[j].insert(x);
L[j].ex += (cnt[x] - 1);
}
}
for (auto &x : a) {
ans += pw[L[x].ex];
}
std::cout << ans << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
pw[0] = 1;
for (int i = 1; i < N; i++) {
pw[i] = pw[i - 1] * 2;
}
int t;
std::cin >> t;
while (t--) {
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 5240kb
input:
2 3 1 2 3 5 3 3 5 1 1
output:
4 11
result:
ok 2 number(s): "4 11"
Test #2:
score: 0
Accepted
time: 28ms
memory: 5444kb
input:
40000 5 4 2 5 5 5 5 5 5 5 5 4 5 1 4 4 4 2 5 2 5 2 4 1 5 3 2 4 5 3 5 1 5 5 3 4 5 5 5 5 4 3 5 4 3 3 5 1 5 4 5 5 2 1 5 2 5 4 2 5 5 3 4 3 4 3 5 5 3 5 1 3 5 5 1 2 4 4 5 4 2 5 1 5 5 5 4 2 5 4 5 5 2 5 2 4 5 1 4 5 4 5 5 4 2 3 2 3 5 1 4 1 3 5 5 1 1 2 1 5 5 5 2 5 1 3 5 3 1 2 5 3 5 5 5 1 1 5 5 2 2 2 1 3 5 3 1 ...
output:
9 16 9 9 8 8 9 8 8 9 13 8 8 8 8 9 12 9 11 15 8 8 17 13 8 11 8 8 8 13 15 9 9 8 8 8 11 9 11 13 15 9 17 9 8 8 8 13 11 8 9 11 8 8 11 15 9 8 9 8 8 15 11 8 17 9 15 8 8 8 12 9 9 11 8 13 9 8 15 8 8 9 8 8 8 15 8 11 13 8 9 11 8 19 11 13 19 17 13 15 8 8 8 9 8 9 13 15 17 9 9 17 9 11 9 9 11 9 9 11 8 9 9 13 15 11...
result:
ok 40000 numbers
Test #3:
score: 0
Accepted
time: 29ms
memory: 5448kb
input:
20000 10 1 3 6 8 3 1 10 7 2 3 10 8 2 8 9 10 5 8 4 8 3 10 2 2 10 1 6 4 4 3 4 7 10 6 5 10 7 8 7 3 1 6 6 10 3 2 3 7 8 4 9 8 8 7 10 9 9 6 4 9 3 9 10 5 9 10 10 8 9 10 10 4 5 1 4 3 10 2 10 4 5 8 10 2 2 7 2 10 2 6 4 10 1 1 1 1 2 3 10 1 10 2 8 1 5 9 4 3 1 10 8 1 8 1 9 5 6 7 2 9 10 1 6 7 4 8 8 7 3 5 7 10 10 ...
output:
97 77 82 74 75 84 75 105 159 95 81 74 78 75 73 73 83 93 90 84 79 77 73 89 77 74 81 79 80 207 83 77 83 78 87 85 84 97 75 80 117 75 113 74 75 95 77 83 86 77 99 73 77 83 91 96 77 80 77 76 84 81 73 95 83 74 75 81 77 79 75 78 78 81 97 77 85 73 92 83 73 80 73 81 74 73 142 83 99 78 91 77 76 81 77 74 78 76 ...
result:
ok 20000 numbers
Test #4:
score: 0
Accepted
time: 29ms
memory: 5160kb
input:
10000 20 5 12 4 16 11 20 3 1 3 13 19 16 3 17 15 9 10 18 19 13 20 4 17 14 3 3 10 6 17 16 17 16 8 1 15 13 12 8 12 10 9 20 18 11 5 11 5 5 9 3 17 10 6 8 5 10 11 15 19 9 10 11 20 7 7 12 13 20 9 14 17 1 10 13 20 10 19 3 12 1 8 8 3 20 13 20 17 12 6 1 16 5 3 2 18 7 2 7 20 1 12 4 7 1 20 15 6 13 1 10 5 13 3 4...
output:
32801 32799 32832 32817 32955 65621 32919 32865 32843 32798 32792 32843 32796 32823 32803 32807 32797 32859 32806 32799 32806 32813 32893 32798 32798 32799 32832 32792 32825 32817 32867 32795 32806 32796 32794 32943 32795 32791 65732 32842 32841 32841 32806 32804 32852 32795 32867 32798 32841 32823 ...
result:
ok 10000 numbers
Test #5:
score: 0
Accepted
time: 30ms
memory: 5416kb
input:
16666 12 11 11 9 7 10 9 7 5 4 8 3 3 12 8 6 8 9 3 10 10 9 1 4 5 10 12 2 1 4 1 2 8 7 11 8 7 5 9 12 4 6 11 11 9 11 3 10 4 9 10 6 12 6 2 11 4 10 9 5 9 5 8 9 2 12 9 10 5 2 2 2 3 6 4 11 8 8 12 7 6 5 4 1 11 1 6 11 9 9 3 12 4 5 11 12 1 3 3 9 4 4 1 11 12 6 9 9 11 4 7 10 5 6 9 8 1 12 7 1 2 1 6 11 8 5 8 8 2 6 ...
output:
269 268 283 268 274 283 277 295 268 291 269 855 275 287 344 299 291 277 329 274 281 276 267 268 268 270 338 275 297 315 273 307 303 302 269 279 272 278 281 302 270 301 295 268 303 279 303 267 279 297 326 272 270 287 287 277 273 276 296 307 274 271 281 278 277 311 273 277 275 315 272 272 293 278 285 ...
result:
ok 16666 numbers
Test #6:
score: -100
Wrong Answer
time: 77ms
memory: 45256kb
input:
1 199999 31326 93089 143392 198151 77233 59844 54715 190000 165927 171095 37063 5018 63088 44405 71037 25580 164377 88095 161549 177275 27730 70339 43759 118378 142428 109706 184253 60233 148241 30394 137958 92664 199171 166535 103239 164430 53636 191124 72007 81005 84139 162416 72120 123920 67659 1...
output:
606157033
result:
wrong answer 1st numbers differ - expected: '201346582', found: '606157033'