CF1770F Koxia and Sequence

若长度为 \(n\) 的非负整数数组 \(a\) 满足下列条件,我们称其为好数组:

  • \(a_1 + a_2 + \dots + a_n = x\)

  • \(a_1 \mid a_2 \mid \dots \mid a_n = y\)

我们定义长度为 \(n\) 的非负整数数组 \(a\) 的权值为 \(a_1 \oplus a_2 \oplus \dots \oplus a_n\),求所有好数组的权值异或和。

\(1 \leq n \leq 2^{40}\)\(0 \leq x < 2^{60}\)\(0 \leq y < 2^{20}\)

我们观察题目中的条件,发现如下性质:

性质 \(1\)\(n\) 为偶数时答案为 \(0\)\(n\) 为奇数时答案为所有好数组的 \(a_1\) 异或和。

考虑 \(n\) 为偶数时若数组 \(a\) 回文,则权值一定为 \(0\),否则一定能找到与 \(a\) 对称的数组 \(a'\),此时 \(a\)\(a'\) 权值的异或和为 \(0\)\(n\) 为奇数时对 \(a_2\)\(a_n\) 应用上面的结论即可,剩下的为 \(a_1\) 的异或和。

接下来考虑好数组的条件。发现两个条件同时满足很难处理,不妨对第二个条件进行容斥。

你考虑对于所有 \(y' \subseteq y\),求出满足 \(a_1,a_2,\dots,a_n \subseteq y'\) 的好数组后进行容斥。不妨考虑按位处理,考虑 \(a_1\)\(2^k\) 出现的次数。由于我们只需要获得其在模 \(2\) 意义下的结果,则可以简单表示为:

\[\bigoplus_{\sum\limits_{i=1}^{n} a_i = x-2^k} [a_1 \subseteq y'-2^k][a_2 \subseteq y']\dots[a_n \subseteq y'] \]

使用卢卡斯定理,可得:

\[\bigoplus_{\sum\limits_{i=1}^{n} a_i = x-2^k} \binom{y'-2^k}{a_1}\binom{y'}{a_2}\dots\binom{y'}{a_n} \]

使用范德蒙德卷积可以化简为:

\[\binom{ny'-2^k}{x-2^k} \]

再次使用卢卡斯定理可得:

\[x-2^k \subseteq ny'-2^k \]

直接判断即可。

#include<iostream>
#include<cstdio>
using namespace std;
const long long V=20;
long long n,x,y;
bool subseteq(long long num1,long long num2){
	return (num1&num2)==num1;
}
long long solve(long long num){
	long long ans=0;
	for(int i=0;i<V;i++){
		long long pre=1<<i;
		if(subseteq(pre,num)  &&  subseteq(x-pre,n*num-pre)){
			ans^=pre;
		}
	}
	return ans;
}
int main(){
	scanf("%lld %lld %lld",&n,&x,&y);
	if(n%2==0  ||  x<y){
		printf("0");
	}
	else{
		long long ans=0;
		for(int i=1;i<(1<<V);i++){
			if(subseteq(i,y)){
				ans^=solve(i);
			}
		}
		printf("%lld",ans);
	}
	return 0;
}
posted @ 2025-11-05 18:06  Oken喵~  阅读(7)  评论(0)    收藏  举报