1 条题解

  • 4
    @ 2026-10-9 10:48:56

    Square

    推荐题目:NOI2015T3,2022省选联考T4。

    题意是:在 P=[1,2,3,…,n]P = [1, 2, 3, \dots , n] 选择子集 XX,X⊂PX\sub P,记 f(X)f(X) 表示集合的元素的乘积。不存在 p∈N+p \in \mathbb N^+,p2∣f(X)p^2 \mid f(X)。计算这样的集合 XX 的个数,对大质数取模。

    I 转化题意

    不难发现原命题相当于令 f(X)=df(X) = d,将其质因数分解成 piaip_i^{a_i}, pip_i 是质数,有 ∀ 0<ai≤1\forall\ 0 < a_i \le 1。

    于是,你想到状压,记下质因数的指数是 00 还是 11。

    设 Ri,j,SR_{i, j, S} 表示已经考虑到 ii,共选了 jj,此时的 f(X)f(X) 的质因数分解的情况为 SS。

    转移简单(真的简单),预处理每个数的质因数分解的 maskxmask_x,去掉能被 p2p^2 整除的,做一遍 DP。

    $R_{i, j, S} = R_{i-1, j, S} + R_{i-1, j-1, S \oplus mask_i}$。

    最后输出答案就行了。

    II 优化DP

    不难发现 500500 以内的质数比较多,状态开不下,上面的 DP,只有 50pts。

    所以考虑优化,你发现一些质数比如说 7979,它的指数最多为 11,因为 792>50079^2 > 500。所以类似地,p≥500,p is primep \ge \sqrt{500}, p\text{ is prime},他们的指数最多只有 11,它们最多选 11 个。

    故修改下原来的定义:maskimask_i 仍旧去掉含平方因子的数字,只有前 1010 个质数的指数的状态。

    综此,我们设计出如下 DP。

    将每个整数找出最大的质因子,如果比 500\sqrt{500},大叫做大数,小的叫做小数。

    对相同最大质因子的大数分别做分组背包,所有小数做 01 背包。滚动数组搞上来。

    复杂度 O(2n×n2)\mathcal{O}(2^n\times n^2)

    • @ 2026-10-9 11:12:15

      非常标准的做法

  • 1

信息

ID
2785
时间
1000ms
内存
128MiB
难度
7
标签
(无)
递交数
36
已通过
7
上传者