题目链接
题目大意
有一个模P意义下的背包,n个物品,每种有无限个,q个询问,问重量为w的方案。
题解:
首先,先考虑如何判断一些物品能否组成重w的背包。
根据贝祖定理,只要这些数和P的最大公约数是w的约数,就可以。
所以,对于本题,就是判断\(2^n\)中方案中,有多少种方案使得选择的数和P的最大公约数是w的约数。
显然,有一个\(O((n+q)*约数个数)\)的dp,会超时。
考虑优化:
对于询问,枚举w的约数x,根据之前的分析,只有x是P的约数才有解。
所以,枚举\(gcd(w,P)\)的约数即可。
由于P的约数不多,所以可以枚举P的约数y,预处理\(gcd(w,P)=y\)时的答案。
对于DP个过程,也可以用类似的方法:
由于要和P取gcd,所以每个V与\(gcd(V,P)\)等价,而不同的\(gcd(V,P)\)只有\(O(P的约数个数)\)个。
这样,枚举\(gcd(V,P)\)进行DP,就行了。
由于要用map定位约数,时间复杂度为\(O(M^2logM+(n+q)logP)\),能过。(M为P的约数个数)
代码
#include
#include