QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#892925#5053. Random ShuffleZnPdCoRE 0ms0kbC++143.1kb2025-02-10 14:29:002025-02-10 14:29:21

Judging History

This is the latest submission verdict.

  • [2025-02-10 14:29:21]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 0kb
  • [2025-02-10 14:29:00]
  • Submitted

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

output:


result: