QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#892925 | #5053. Random Shuffle | ZnPdCo | RE | 0ms | 0kb | C++14 | 3.1kb | 2025-02-10 14:29:00 | 2025-02-10 14:29:21 |
Judging History
answer
#include <bits/stdc++.h>
#define ull unsigned long long
#define N 100010
using namespace std;
int n, m, a[N], b[N], aa[N], aaa[N];
ull c[N];
bitset<65> f[100];
int d[64][64];
ull ans[65];
bool check() {
// ull x = 16659580358178468547ull;
// for (int i = 0; i < 64; i++) ans[i + 1] = (x >> i) & 1;
for (int i = 1; i <= m; i++) {
ull y = 0;
for (int j = 1; j <= 64; j++) if(f[i][j]) {
y ^= ans[j];
}
if (y != f[i][0]) {
return 0;
}
}
return 1;
}
void dfs(int i) {
if (i == 0) {
ull x = 0;
for (int i = 0; i < 64; i++) x |= ans[i + 1] << i;
ull y = x;
for (int i = 1; i <= n; i++) {
aa[i] = i;
y ^= y << 13;
y ^= y >> 7;
y ^= y << 17;
swap(aa[i], aa[y % i + 1]);
}
for (int i = 1; i <= n; i++) if (aaa[i] != aa[i]) return;
printf("%llu", x);
exit(0);
return;
}
if (f[i][i]) {
ans[i] = f[i][0];
for (int j = i + 1; j <= 64; j++) {
if (f[i][j]) ans[i] ^= ans[j];
}
dfs(i - 1);
} else {
ull y = 0;
for (int j = i + 1; j <= 64; j++) {
if (f[i][j]) y ^= ans[j];
}
if (y != f[i][0]) return;
ans[i] = 1;
dfs(i - 1);
ans[i] = 0;
dfs(i - 1);
}
}
int main() {
freopen("C.in", "r", stdin);
freopen("C.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
aaa[i] = a[i];
b[a[i]] = i;
}
for (int i = n; i >= 1; i--) {
// 第 i 次 rand 值 % i 为 b[i] - 1
c[i] = b[i] - 1;
swap(a[i], a[b[i]]);
b[a[b[i]]] = b[i];
b[a[i]] = i;
}
for (int i = 0; i < 64; i++) d[i][i] = 1;
for (int i = 1; i <= n && i <= 2000; i++) {
for (int k = 63; k >= 13; k--) {
for (int l = 0; l < 64; l++) d[k][l] ^= d[k - 13][l];
}
for (int k = 0; k < 64 - 7; k++) {
for (int l = 0; l < 64; l++) d[k][l] ^= d[k + 7][l];
}
for (int k = 63; k >= 17; k--) {
for (int l = 0; l < 64; l++) d[k][l] ^= d[k - 17][l];
}
int o = 6;
for (int j = 64; j >= 1; j >>= 1, o--) {
if (i % j == 0) break;
}
for (int j = 0; j < o; j++) {
f[++m][0] = (c[i] >> j) & 1;
for (int k = 0; k < 64; k++) {
f[m][k + 1] = d[j][k];
}
}
}
for (int i = 1; i <= 64; i++) {
for (int k = i; k <= m; k++) {
if (f[k][i]) {
swap(f[k], f[i]);
break;
}
}
if (!f[i][i]) continue;
for (int k = i + 1; k <= m; k++) if (f[k][i]) {
f[k] ^= f[i];
}
}
for (int i = 1; i <= 64; i++) {
for (int j = 1; j <= 64; j++) {
fprintf(stderr, "%d", f[i].test(j));
}
fprintf(stderr, "\n");
}
dfs(64);
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Dangerous Syscalls
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