【CF1770F】Koxia and Sequence 容斥 组合数 思维
求所有长 , 或值为 , 和为 的序列的异或和 。
考察了对组合数奇偶性公式很深的理解。
前置知识:组合数奇偶性公式
当且仅当 的二进制表示是 的子集。
证明:
因为 是质数,使用卢卡斯定理分解至每个二进制为上 , 当且仅当 。
首先根据序列的强对称性不妨将它看作集合,每个位置出现每个数的方案数是相同的,也就是说序列长度为偶数时答案为 , 为奇数时每个数 的贡献为 “满足条件的含 的集合的个数”,由于时异或运算,只需要考虑奇偶即可。
于是我们现在枚举某个元素的某一位为 并计算贡献,令枚举的这位是 ,贡献为:和为 ,或和 且第一项的 位是 的 项的序列的数量。 或为某个数时难以计算的,所以考虑容斥,那么要限制每个元素都是要求集合的子集。的贡献为为
其中 为二进制或, 表示 在二进制下 的个数。
式子的意义是限制 的剩余部分和其它项是对应的子集的所有序列。
以为是在模 意义下的,所以 不用考虑,后面那坨 项的式子的看上去没办法求,但是如果我们逆用组合数奇偶公式就可以转化成
和为 的所有序列这个神奇的限制可以让我们把后面的式子用范德蒙德卷积(组合意义),化为
再使用组合数奇偶性可以计算。
时间复杂度 。
代码:
read(n,x,y);
int ans = 0 ;
if(n % 2==0)puts("0"),exit(0);
for(int b = 0 ; b < 20 ; ++ b) {
if(y >> b & 1) {
for(int subset = 0 ; subset <= y ; ++ subset) {
if((subset | y) == y) {
if(subset >> b & 1) {
int down = x - (1 << b);
int up = n * subset - (1 << b) ;
if( !(~up & down) ) ans ^= 1 << b ;
}
}
}
}
}
wrt(ans,'\n') ;
return 0;
收录于《超级无敌神仙炫酷无敌原神大王好题》 。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17096146.html,谢谢你的阅读或转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2022-02-06 atcoder近期比赛记录