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;
}

浙公网安备 33010602011771号