CF1770F 题解

link 。很困难的二进制计数。


前置知识 1:范德蒙德卷积推广。

a1+a2++an=k,aiNj=1n(biai)=(b1+b2++bnk)。这里给一个组合意义的证明。

RHS 相当于在 bi 个物品中选 k 个的方案数,LHS 相当于枚举对于每 bi 各选了几个,且满足总和为 k。于是 LHS,RHS 所表示的组合意义的值是一样的。


前置知识 2Kummer 定理,大家可以看这个学习。

Kummer 定理:vp((n+mm)) 等于 n+mp 进制表示下进位的次数,其中 p 为素数。

这题用到当 p=2 时,此时 (n+mm)mod. 2 等于 n+m 是否进位,所以 (n+mm)[mn](mod2),其中 是在二进制意义下。


这题考虑条件具有很强的对称性,所以当 n 为偶数时 xor 会一一对应消掉,所以答案为 0

n 为奇数时,考虑对答案拆位,目前做到了 2k,且 2ky,这时候可以钦定 a1 的第 k 位为 1,由于 xor 的性质且 n 为奇数于是答案不会发生变化。下面把 a1 减去 2k

这时我们要统计 2k 被计算次数的奇偶性(设为 s)。考虑 or 值为 y 比较困难,考虑容斥。

f(Y) 表示 orY2k 被计算次数,则 s=Yy(1)|y||Y|f(Y)Yyf(Y)(mod2)

这样枚举 k,Y 的复杂度就是 O(ylogy) 了,我们只需快速计算 f(Y) 即可。

f(Y)=ai=x2k[a1y2k][a2y][a3y][any]ai=x2k(y2ka1)(ya2)(ya3)(yan)=(ny2kx2k)=[x2kny2k]

于是 f(Y) 可以 O(1) 计算,总复杂度 O(ylogy)

code
#include<bits/stdc++.h>
#define LL long long
#define fr(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
using namespace std;
LL n,x,y,ans;
inline bool in(LL x,LL y){return (x&y)==x;}
int main()
{
	scanf("%lld%lld%lld",&n,&x,&y);if(n&1^1) return 0*puts("0");LL s=1;
	for(int i=0;i<20;i++,s<<=1) for(int j=0;j<=y;j++) if(in(j,y)&&(j&s)) ans^=s*in(x-s,n*j-s);printf("%lld",ans);
	return 0;
}
posted @   HaHeHyt  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
主题色彩
主题色彩