CF1770F Koxia and Sequence 做题记录

给定非负整数 n,x,yn,x,y,对于所有满足 i=1nai=x\sum \limits_{i=1}^n a_i=x,所有 aia_i 按位或和为 yy 的序列 aa,求出 i=1nai\oplus_{i=1}^n a_i 的异或和。

1n2401\le n\le 2^{40}0x<2600\le x< 2^{60}0x<2200\le x< 2^{20}

不难发现由于可以任意调换位置,所以所有 aia_i 本质相同,也就是说,nn 为偶数时答案为 00

考虑 nn 为奇数的情况,此时只需要统计所有 a1a_1 的异或和即可。

考虑拆位,对每个 ii 计算 a1a_1ii 位为 11 的方案数 mod 2\text{mod }2 的结果 cnticnt_i,则答案即为 2icnti\sum 2^icnt_i

考虑通过容斥计算 cnticnt_i,设 f(y)f(y') 表示 aia_i 的或和为 yy' 的子集且 a1a_1ii 位为 11 的方案数,则:

cnti=yy(1)yyf(y)=yyf(y)cnt_i=\oplus_{y'\subseteq y}(-1)^{|y|-|y'|}f(y')=\oplus_{y'\subseteq y}f(y')

考虑计算 f(y)f(y'),由于 a1a_1ii 位一定为 11,所以不妨令 a1a1yia_1\to a_1-y^i,则有:

f(y)=a1+a2++an=x2i[a1(y2i)]i=2n[aiy]mod2f(y')=\sum\limits_{a_1+a_2+\dots+a_n=x-2^i}[a_1\subseteq (y'-2^i)]\prod\limits_{i=2}^n[a_i\subseteq y']\mod 2

注意到 (nm) mod 2=[mn]\binom{n}{m}\text{ mod }2=[m\subseteq n],所以:

f(y)=a1+a2++an=x2i(y2ia1)i=2n(yai)mod2=(ny2ix2i)mod2=[(x2i)(ny2i)]\begin{aligned} f(y')&=\sum\limits_{a_1+a_2+\dots+a_n=x-2^i}\binom{y'-2^i}{a_1}\prod\limits_{i=2}^n\binom{y'}{a_i}\mod 2\\ &=\binom{ny'-2^i}{x-2^i}\mod 2\\ &=[(x-2^i)\subseteq(ny'-2^i)]\\ \end{aligned}

所以答案为:

2iyy[(x2i)(ny2i)]\sum 2^i\oplus_{y'\subseteq y}[(x-2^i)\subseteq(ny'-2^i)]

时间复杂度 O(ylogy)O(y\log y),代码如下:

#include <iostream>
#include <cstdio>

using namespace std;

long long n,x;
int y;

int main()
{
	scanf("%lld%lld%d",&n,&x,&y);
	if(n&1^1) return puts("0"),0;
	int ans=0;
	for(int i=0;i<20;i++)
	{
		int f=0;
		for(int j=y;j>0;j=(j-1)&y)
		{
			if(j>>i&1^1) continue;
			f^=((x-(1<<i))|(n*j-(1<<i)))==(n*j-(1<<i));
		}
		ans+=f<<i;
	}
	printf("%d\n",ans);
	return 0;
}