Loading

CF1770F 题解

\(\text{link}\) 。很困难的二进制计数。


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

\(\sum\limits_{a_1+a_2+\dots+a_n=k,a_i\in \N} \prod\limits_{j=1}^n\dbinom{b_i}{a_i}=\dbinom{b_1+b_2+\dots+b_n}{k}\)。这里给一个组合意义的证明。

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


前置知识 \(2\)\(\texttt{Kummer}\) 定理,大家可以看这个学习。

\(\texttt{Kummer}\) 定理:\(v_p\left(\dbinom{n+m}{m}\right)\) 等于 \(n+m\)\(p\) 进制表示下进位的次数,其中 \(p\) 为素数。

这题用到当 \(p=2\) 时,此时 \(\dbinom{n+m}{m}\text{mod. 2}\) 等于 \(n+m\) 是否进位,所以 \(\dbinom{n+m}{m}\equiv [m\subseteq n]\pmod 2\),其中 \(\subseteq\) 是在二进制意义下。


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

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

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

\(f(Y)\) 表示 \(\text{or}\)\(\subseteq Y\)\(2^k\) 被计算次数,则 \(s=\sum\limits_{Y\subseteq y} (-1)^{|y|-|Y|}f(Y)\equiv \sum\limits_{Y\subseteq y} f(Y)\pmod 2\)

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

\(f(Y)=\sum \limits_{\sum a_i=x-2^k}[a_1\subseteq y-2^k][a_2\subseteq y][a_3\subseteq y]\dots [a_n\subseteq y]\equiv \sum \limits_{\sum a_i=x-2^k}\dbinom{y-2^k}{a_1}\dbinom{y}{a_2}\dbinom{y}{a_3}\dots\dbinom{y}{a_n}=\dbinom{ny-2^k}{x-2^k}=[x-2^k\subseteq ny-2^k]\)

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

$\texttt{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 @ 2023-05-22 22:09  HaHeHyt  阅读(24)  评论(0编辑  收藏  举报