ARC146C Even XOR(线性基,组合)

ARC146C Even XOR

有多少集合 S,每个元素都在 [0,2N) 之间,且所有偶数大小的子集的异或和不为 0

CODE

奇数大小的子集 和可以为 0,可是如果有 2 个不空且不相同的奇子集 S,T 和都为 0ST 是个偶子集,则其 和是 0

如果没有这个奇偶的限制,则根据线性基的性质,答案就是

i=0n1i!j=0i1(2n2j)

否则 DP,设 f(i,t=0/1) 表示当前已经放到了第 i 个数,t 表示是否已经有奇子集 和为 0f(i,0)f(i+1,1) 就选前 i 个数理的线性基已经能凑出来的数。有 2i 种,但是只有 2i1 满足“奇数大小”要求。具体可以看代码。

void solveT() {
	cin >> n;
	vector<int> f = {1, 0};
	int res = 1;
	R(i, 1, n + 2) {
		if (i == 1) f[1] = 1;
		else f[1] = add(mul(f[1], add(p2[n], mod - p2[i - 2])), mul(f[0], p2[i - 2]));
		f[0] = mul(f[0], add(p2[n], mod - p2[i - 1]));
		res = add(res, mul(add(f[1], f[0]), ifac[i]));
	}
	cout << res ntr;
}
posted @   Pizza1123  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示
主题色彩