有 \(n\) 个球球,每个球球有一个属性值 。一个合法的排列满足不存在相邻两个球球的属性值乘积是完全平方数。求合法的排列数量对 \(10^9+7\) 取膜。
\(n\le 300\) (本题数据范围可扩大至 \(n\le 3000\)) 。
首先很显然,如果 \(xy,yz\) 是完全平方数,那么 \(xz\) 也是完全平方数。这样我们可以将球球分成若干组,每组的两两乘积都是完全平方数。
那么问题转化为有若干球球,每个球球一个颜色,求满足相同颜色的球球不相邻的排列数。
下设 \(a_i\) 为第 \(i\) 种颜色的球球个数, \(m\) 为颜色个数。
我们考虑容斥。对于每种颜色,我们将相邻的小球球合并成一个大球球,设 \(b_i\) 为大球球的数量,那么答案即为 \(b\) 的可重排列数量乘上每种颜色内部排列的数量 \(\displaystyle \frac{(\sum_{i=1}^mb_i)!}{\prod_{i=1}^mb_i!} \cdot \prod_{i=1}^m a_i!\) ,容斥系数用插板法计算,为 \(\displaystyle \prod_{i=1}^m (-1)^{a_i-b_i} \cdot \binom{a_i-1}{b_i-1}\) 。
考虑如何计算这个式子。设 \(s=\sum_{i=1}^m b_i\) ,那么答案式子可转化为:
\[
(-1)^{n-s} s!\prod_{i=1}^{m}\frac{\binom{a_i-1}{b_i-1}\cdot a_i!}{b_i!}
\]
我们考虑用 dp 计算后半部分式子。设 \(f(i,j)\) 表示前 \(i\) 个数, \(\sum_{x=1}^i b_x=j\) 的方案数。枚举 \(b_i=k\) 转移:
\[
f(i,j)=\sum_{k=1}^{\min(a_i,j)}f(i-1,j-k)\cdot \frac{\binom{a_i-1}{k-1}\cdot a_i!}{k!}
\]
最后按上面的式子枚举 \(s\) 容斥统计答案即可。
dp 的复杂度看上去像 \(n^3\) ,实际上理性分析,复杂度为 \(\sum_{i=1}^n a_i \sum_{j=1}^i a_j =O(n^2)\) .
【Luogu4448】 [AHOI2018初中组]球球的排列
原文:https://www.cnblogs.com/farway17/p/10972387.html