NOIP 模拟赛
11.5
流星雨
给定一个多项式 \(P(x) = \sum_{i=0}^{n-1} a_i x^i,\ a_i \in \{0, 1\}\),求 \(P^k(x)\) 中有多少项的系数是奇数
数据范围:\(1 \le n \le 20,\ 1 \le k \le 10^{16}\)
首先,根据 \((a + b)^p \equiv a^p + b^p \pmod p\),我们观察到一个性质:\(P^2(x) \equiv P(x^2) \pmod 2\),也就是说 \(\text{popcnt}(P^2(x)) = \text{popcnt}(P(x^2))\),那么,根据这个性质,我们就可以将 \(k\) 二进制分解,做 \(\lg k\) 次多项式乘法,期望得分 \(60\)
下文中 \(F(x) \equiv G(x) \pmod 2\) 意思是 \(\forall k \in [0, n - 1], [x^k] F(x) \equiv [x^k] G(x) \pmod 2\),这也意味着 \(\text{popcnt}(F(x)) = \text{popcnt}(G(x))\)
上面的性质启示我们通过递推解决问题,即当 \(2 | k\) 时,有 \(P^k(x) \equiv P^{k/2}(x^2)\)
接着我们需要考虑 \(k\) 是奇数的情况,\(P^{2t+1}(x) \equiv P^{t}(x^2) \times P(x)\)
这时我们就需要用到多项式分治的经典方法了:按指数奇偶性分类
即 \(f(x) = f_0(x^2) + x f_1(x^2)\)
那么,\(P^{2t+1}(x) \equiv P^{t}(x^2) \times (P_0(x^2) + xP_1(x^2)) \equiv P^t(x^2)P_0(x^2) + xP^t(x^2)P_1(x^2)\)
而且,由于是按照指数分类,上面和式的前后两项不会有同类项,于是,
到这里,我们再手动往下推几层,就可以看出来子问题了:求 \(\text{popcnt}(P^t(x)G(x))\),并且,由于转移时 \(t \rightarrow \lfloor t/2 \rfloor\),我们只需要求 \(t = \lfloor k / 2^i \rfloor\) 的答案,另 \(dp(i, G) = \text{popcnt}(P^{\lfloor k / 2^i \rfloor}(x)G(x))\),就可以按上述拆解方法转移了
11.13
P10681 [COTS 2024] 奇偶矩阵 Tablica
题面
考虑只包含 $0$ 和 $1$ 的 $N\times M$ 矩阵 $A$。我们称满足以下条件的矩阵是好的:
- \(\forall 1\le i\le N\),\(\displaystyle \sum_{j=1}^M A_{i,j}\in \{1,2\}\);
- \(\forall 1\le j\le M\),\(\displaystyle \sum_{i=1}^N A_{i,j}\in \{1,2\}\)。
求出 \(N\) 行 \(M\) 列的好的矩阵的数量,对 \((10^9+7)\) 取模。
以下假设 \(n \ge m\)
题目相当于我们要在每一行选 \(1\) 或 \(2\) 列填上 \(1\),并且每行选的数中不能有多于两个相同。
再进一步简化,相当于我们要选 \(n\) 个 \(pair\) 或单点,联系到之前的一个 CF 题,我们可以将 \(pair\) 也拆成单点考虑,
所以问题就变成:选 \(k\) 个数,\(1 \sim m\) 至少出现一次,相同的数不超过两个,再将他们分配到 \(n\) 个大小至多为 \(2\) 的非空集合里面,每个集合不能有相同元素的方案数,集合有标号
首先,我们发现大小为 \(2\) 的集合个数为 \(b = k - n\),首先我们钦定哪几个集合大小为 \(2\),方案数是 \(n \choose b\)
然后我们钦定除了 \(1 \sim m\) 还要选哪些数,方案数是 \(m \choose k - m\)
接着,我们考虑将这 \(k\) 个数分配至 \(n\) 个集合中的方案数,由于会有相同数分到同一个集合的情况,需要先进行容斥:
钦定有 \(t\) 个集合选了两个重复的数,那么这 \(t\) 个集合的选法有 \(b \choose t\) 种,重复的数的值又有 \(d \choose t\) 种,而且由于所钦定的集合之间顺序不固定,将他们全排列,有 \(t!\) 种方案。
然后剩下的数就可以随便排列,按顺序分配到剩下的集合当中,即对于一个排列,从前往后遍历这个排列,如果当前盒子不满,就放进去,否则往后挪一个盒子,也就是说每个排列都对应一种分配方法,这个方案数是可重集的全排列 \(\frac{(k - 2t)!}{2^{k - m - t}}\)
最后,由于集合是无序的,需要给答案除以 \(2^b\),并且,应该先容斥,再除以这个系数,因为在容斥的时候,如果有未被钦定的两个相同元素被分配到同一集合,那么多重集排列数会除一个 \(2\),集合间元素无序又会除一个 \(2\),就会多除,而容斥完后就没有相同元素在同一集合了,可以放心除
那么,最终式子应该长这样:
\(O(\min(m, n)^2)\)
当然,这种矩阵问题每行每列固定 \(1\) 的个数也可以二分图建模,将行看作左部点,列看作右部点,那么边 \((i, j)\) 就意味着点 \((i, j)\) 上填 \(1\),再本题中,就是说不能有二度点,不能有重边的连边方案数,推一下也能得到上面的式子
另一道二分图建模的题:CF1913E Matrix Problem

浙公网安备 33010602011771号