Loading

MX galaxy Day17

code

暴力可过。

perm

我们能够处理出每次随机数 \(\bmod i\) 的值,但是这样貌似没什么用。
因为随机数是通过位运算生成的,所以按位考虑。
我们能够处理出此时的随机数每一位是由初始的哪些位置异或出来的。
而得知 \(\bmod i\) 的结果意味着我们知道了 \(b\mod lowbit(i)\) 的结果。

我们就可以得到关于 \(x\)\(\log^2\) 个异或方程组。
高斯消元后,我们获得了一些未知的元,可以得知上界最多有 \(17\) 个,在 \(n=50\) 的下界取到。

所以直接暴力枚举这些未知的自由元,推出其他的元,然后直接验证即可。

点击查看

#include <bits/stdc++.h>
#define lep(i, a, b) for (int i = a; i <= b; ++i)
#define rep(i, a, b) for (int i = a; i >= b; --i)

const int _ = 2e6 + 7;
const int V = 63;
typedef long long ll;
typedef unsigned long long ull;

int n, a[_], p[_], c[_], tot, q[_], lg[_]; ull v[_], S[V + 1], ans;
std::vector <int> fr, pr;

void trn() {
	rep(i, V, 13) S[i] ^= S[i - 13]; //<<13
	lep(i, 0, V - 7) S[i] ^= S[i + 7];//>>7
	rep(i, V, 17) S[i] ^= S[i - 17];//<<17
}
bool ck(ull x) {
	lep(i, 1, n) {
		x ^= x << 13, x ^= x >> 7, x ^= x << 17;
		if (x % i + 1 != c[i]) return false;
	}
	return true;
}

signed main() {
	std::ios::sync_with_stdio(false),
	std::cin.tie(nullptr), std::cout.tie(nullptr);
	
	std::cin >> n;
	lep(i, 1, n) std::cin >> a[i], p[a[i]] = i;
	
	lep(i, 2, n) lg[i] = lg[i >> 1] + 1;
	rep(i, n, 1) {
		c[i] = p[i], p[a[i]] = p[i];
		std::swap(a[i], a[p[i]]), p[i] = i;
	}
	
	rep(i, V, 0) S[i] = (1ull << i);
	lep(i, 1, n) {
		trn(); 
		int k = lg[i & -i]; 
		rep(j, k - 1, 0) v[tot] = S[j], q[tot] = ((c[i] - 1) >> j) & 1, ++tot;
	}
	
	lep(j, 0, V) {
		int r = j;
		lep(i, j, tot - 1) if ((v[i] >> j) & 1) { r = i; break; }
		std::swap(v[j], v[r]), std::swap(q[j], q[r]);
		if (!((v[j] >> j) & 1)) continue;
		lep(i, 0, tot - 1) if (i != j and ((v[i] >> j) & 1)) v[i] ^= v[j], q[i] ^= q[j];
	}
	
	lep(j, 0, V) if (!((v[j] >> j) & 1)) fr.push_back(j); else pr.push_back(j);
	
	int l = (int)fr.size(), r = (int)pr.size() - 1, len = ~l ? ((1 << l) - 1) : 0;
	lep(S, 0, len) { ans = 0;
		lep(i, 0, l - 1) ans ^= (ull((S >> i) & 1) << fr[i]);
		lep(i, 0, r) {
			lep(j, 0, V) if (pr[i] != j and ((v[pr[i]] >> j) & 1)) ans ^= (ull((ans >> j) & 1) << pr[i]);
			ans ^= ((ull)q[pr[i]] << pr[i]);
		}
		if (ck(ans)) { std::cout << ans << '\n'; return 0; }
	}
	
	return 0;
}

posted @ 2025-07-30 21:34  qkhm  阅读(5)  评论(0)    收藏  举报