ARC144D AND OR Equation
ARC144D AND OR Equation
2022.07.18
Atcoder:ARC144D AND OR Equation
Solution
首先要读清题目,这里的数列 \(S=(f(0),f(1),...,f(2^N-1))\) 包含所有 \(f(k),k\in[0,2^N)\)。
\(f(2^{i+1}+x)=f(2^{i+1})+f(x)-f(0)\),\(x\le 2^i\)。
由 \(f(A)+f(B)=f(A\,\operatorname{and}\,B)+f(A\,\operatorname{or}\,B)\),且 \(x\) 与 \(2^{i+1}\) 不重合,
必有 \(f(2^{i+1})+f(x)=f(0)+f(x+2^{i+1})\),移项可得。
\(f(x)=f(0)+\sum\limits_{2^i \&x}(f(2^i)-f(0))\)。
设 \(y=2^{i+1}+x\),则 \(f(y)=f(2^{i+1})+f(y-2^{i+1})-f(0)\)。
即:若 \(x\) 的最高位为 \(i\),则有 \(f(x)=f(x-2^i)+f(2^i)-f(0)\)。
相当于就是把 \(x\) 的 \(1\) 位给减掉,并每次加上贡献 \(f(2^i)-f(0)\)。
减到最后剩下 \(f(0)\),因此要单独加上 \(f(0)\)。
答案为满足 \(\sum\limits_{i=0}^{N-1}|x_i|\le K\) 的 \(x\) 数列的数量。
由结论 \(2\),观察发现原 \(f\) 数列的取值仅与 \(f(0),f(1),f(2),f(4),...f(2^{N-1})\) 这些 \(f(2^{i})\) 项有关。
记 \(w_i=f(2^i)-f(0)\),则 \(f(x)=f(0)+\sum\limits_{2^i \&x}w_i\)。
相当于我们构造出来了一个新的数列 \(w=\{w_0,w_1,...,w_{N-1} \}\)。
根据正负性分类,
对于整个 \(w\) 数列,假设 \(s^{-}\) 表示 \(<0\) 的 \(w_i\) 的和,\(s^{+}\) 表示 \(>0\) 的 \(w_i\) 的和,
由于要满足 所有 \(f(x)\) 都要满足 \(f(x)\in[0,K]\),且由于自变量取值为连续整数,
所以 一定存在 某个 \(f(x)\) 的 \(\sum\limits_{2^i \&x}w_i=s^{-}\),且 一定存在 某个 \(f(x)\) 的 \(\sum\limits_{2^i \&x}w_i=s^{+}\)。
我们只需要满足 极端情况 即可。
也就是说,原限制等价于:\(f(0)+s^{-}\ge 0\) 且 \(f(0)+s^{+}\le K\)。
合并得 \(-s^{-}\le f(0) \le K-s^{+}\)。
只要该不等式的解集非空,则范围内的 \(f(0)\) 一定都满足条件。
即我们只需要让 \(K-s^{+}\ge -s^{-} \iff s^{+}-s^{-}\le K\)。
\(s^{+}-s^{-} \ge 0\),因此我们只用考虑上界。
不难发现 \(s^{+}-s^{-}=\sum\limits_{i=0}^{N-1}|w_i|\),因此原问题转化为 \(\sum\limits_{i=0}^{N-1}|w_i|\le K\)。
现在计算答案。
来到了纯组合计数部分。
设 \(w\) 数列中有 \(n\) 个非零数,方案数为 \({{N}\choose{n}}\)。这样一来,其余所有 \(0\) 只有一种选取方案,只用考虑非零数。
每个非零数有正负两种取值,因此乘上 \(2^n\)。
我们还需要乘上一个数:对 \(n\) 个正数(非零数的绝对值)赋值的方案数,使得他们的和 \(\le K\)。
这个跟有道题有异曲同工之妙,那个题的形式是这样的:求 \(\sum\limits_{i=1}^k(x_i+y_i)\le n\) 的方案数。、
那个不用考虑非零,因此将左边加一个非负数 \(z\),使得 \(z+\sum\limits_{i=1}^k(x_i+y_i)= n\)。然后进行插板法,由于有 \(2k+1\) 个数,且可以为 \(0\),因此直接处理是可行的,答案为 \({{n+2k}\choose{2k}}\)。
这个不一样,他要求 \(|w_i|>0\)。我们设这些绝对值的数列为 \(\{x_1,x_2,...,x_n \}\)。
并且,每一种合法情况其实是对应着取值不同的 \(f(0)\),我们其实是要加上 \(f(0)\),而不仅仅只是对于一种合法情况仅计数 \(1\)。由上面,\(f(0)\) 的取值数为 \(K-s^{+}+s^{-}+1=K-(s^{+}-s^{-})+1=K-\sum\limits_{i=1}^{n}x_i+1\)。
所求为: \(\sum\limits_{x}(K-\sum\limits_{i=0}^{n}x_i+1)[\sum\limits_{i=0}^{n}x_i\le K]\)。
如果仅仅是求 \(\sum\limits_{x}[\sum\limits_{i=1}^{n}x_i\le K]\),只需将 \(\sum\limits_{i=1}^{n}x_i\le K\) 转化为 \(a+\sum\limits_{i=1}^{n}x_i = K+1\)。注意加一,因为 \(a>0\)。
而这道题对于 \(S=\sum\limits_{i=1}^{n}x_i\),还要加上 \(a+\sum\limits_{i=1}^{n}x_i=K\),\(a+\sum\limits_{i=1}^{n}x_i\le K-1\),...,\(a+\sum\limits_{i=1}^{n}x_i\le S+1\)。
可以考虑直接记作 \(a+ \sum\limits_{i=1}^n x_i \le K+1\),因为对于一个 \(S\),所有满足条件的不等式都应该被统计一遍。
然后这个就可以用上面的那种方法转成等号进行插板,即求 \(a+b+\sum\limits_{i=1}^nx_i=K+2\) 的 \(x\) 方案数。
这个方案数为:\({{n+1}\choose{K+1}}\)。
于是最终答案为:
不要怕 \(K\) 很大,由于 \(N\) 很小,因此可以 \(O(N)\) 枚举计算。
于是我一定记住了这样一种处理方法:通过增加变量建立等量关系,运用基础方法解决组合计数。
Summary
做这道题对我的意义还是比较大的。我相信了这一个月来,对具体数学组合部分的阅读并不只是对公式的满足,而是真正的组合数学,组合意义背后的涵义。
我也开始坚信见多识广的好处,从这道题里,我能看见很多我未曾设想的事物,他们并不是我不能接触的,不过是我没有接触的。
如何才能不盲目地探索?
我知道这仍是一条未知的道路。
爆淦 7h。 完。