QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#823019 | #5053. Random Shuffle | Zhejiang U: Plenty of Penalty# | WA | 241ms | 3648kb | C++20 | 2.5kb | 2024-12-20 18:22:04 | 2024-12-20 18:22:05 |
Judging History
answer
#include <bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) begin(x), end(x)
#ifdef memset0
#define log(...) fprintf(stderr, __VA_ARGS__)
#else
#define log(...) (void(0))
#define endl '\n'
#endif
using namespace std;
using ll = long long;
using lf = long double;
using lll = __int128;
using ull = unsigned long long;
const int N = 1e5 + 10;
const int M = 70, B = 64;
int n, p[N], a[N], pos[N], rv[N], tp, sz;
ull fr[M];
ull b[M], b2[M], e[M], ans, prt;
void Trans() {
for (int i = B - 1; i >= 13; --i) fr[i] ^= fr[i - 13];
for (int i = 0; i < B - 7; ++i) fr[i] ^= fr[i + 7];
for (int i = B - 1; i >= 17; --i) fr[i] ^= fr[i - 17];
}
void Ins(ull x, int t) {
log("INS %llu %d\n", x, t);
for (int i = 0; i < B; ++i) {
if ((x >> i) & 1) {
// log("in %d=1\n", i);
if (!b[i]) {
b[i] = x, e[i] = t;
return;
} else {
x ^= b[i];
t ^= e[i];
}
}
}
assert(!t);
}
ull xorshift(ull x) {
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
return x;
}
void Check(ull tv) {
ull x = tv;
log("CHECK %llu\n", x);
for (int i = 1; i <= n; ++i) {
a[i] = i;
x = xorshift(x);
if (x % i != rv[i]) return;
}
cout << tv << "\n";
exit(0);
}
int r[N], m;
int main() {
#ifdef memset0
freopen("C.in", "r", stdin);
#endif
cin.tie(0)->sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> p[i];
a[i] = p[i];
pos[a[i]] = i;
}
for (int i = n; i >= 1; --i) {
tp = pos[i];
rv[i] = tp - 1;
log("pos %d=%d\n", i, rv[i]);
if (tp != i) {
pos[a[i]] = tp;
swap(a[tp], a[i]);
}
}
for (int i = 0; i < B; ++i) fr[i] = (1ull << i);
for (int i = 1; i <= n; ++i) {
Trans();
for (int j = 0, t = i; !(t & 1); ++j, t >>= 1) {
Ins(fr[j], (rv[i] >> j) & 1);
}
if (sz == B) break;
}
// assert(sz == B);
for (int i = 0; i < B; ++i)
if (!b[i]) {
r[m++] = i;
}
for (int i = 0; i < B; ++i) b2[i] = b[i];
// Check(16659580358178468547ull);
for (int i = 0; i < (1 << m); ++i) {
for (int j = 0; j < B; ++j) b[j] = b2[j];
for (int j = 0; j < m; ++j) {
b[r[j]] = (1ull << r[j]);
e[r[j]] = ((i >> j) & 1);
}
for (int j = B - 1; j >= 0; --j) {
for (int k = j - 1; k >= 0; --k) {
if ((b[k] >> j) & 1) {
b[k] ^= b[j];
e[k] ^= e[j];
}
}
}
for (int j = B - 1; j >= 0; --j) {
ans = ((ans << 1) | e[j]);
}
Check(ans);
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 241ms
memory: 3648kb
input:
50 36 22 24 21 27 50 28 14 25 34 18 43 47 13 30 7 10 48 20 16 29 9 8 15 3 31 12 38 19 49 37 1 46 32 4 44 11 35 6 33 26 5 45 17 39 40 2 23 42 41
output:
result:
wrong output format Unexpected end of file - int64 expected