【JZOJ 5464】 乘积

来源:互联网 发布:手机淘宝微淘在哪里看 编辑:程序博客网 时间:2024/05/20 18:17

Description

选择不超过K个N以内的正整数乘起来,使得乘积是一个无平方因子数,有多少种取法?(每个数只能取一次)
无平方因子数x满足μ(x)!=0
对于70%的数据:N≤30;
对于100%的数据:1≤T≤5;1≤K≤N≤500。

70%

这档很简单,直接用f[i][j][s]表示选到第i个数,共选了j个,质因子出现二进制状态为s的方案数

100%

考虑对70分的dp进行优化
可以发现,对于较大的质因子,它在一个数中出现的次数很少
具体而言,当p>n0.5时,p在n范围内的数中至多出现一次
如果我们将每个数按最大的质因子分组,那么每个组里面至多选一个数
这样分组来dp,就可以把大于根号n的那些二进制状态省掉了
注意,直接这样做可能会比较慢
注意i<=306(500以内无平方因子数个数),j<=96(500以内不同质数个数)
这样复杂度就很有保障了

原创粉丝点击