一篇充分发挥人类智慧的题解-统计方案

原题目:

统计方案

题目描述
小B写了一个程序,随机生成了n个正整数,分别是a[1]…a[n],他取出了其中一些数,并把它们乘起来之后模p,得到了余数c。但是没过多久,小B就忘记他选了哪些数,他想把所有可能的取数方案都找出来。你能帮他计算一下一共有多少种取数方案吗?请把最后的方案数模1000000007后输出。

小B记得他至少取了一个数。

输入格式:

第一行三个正整数n,p,c,含义如题目所述。

接下来一行有n个正整数,表示生成的n个随机数。

输出格式:

一个数,方案数模1000000007。

样例输入:

3 7 2
1 2 4

样例输出:

2

数据范围:

对于30%的数据,n≤16

另有30%的数据,p≤10000

对于100%的数据,n≤32, p≤10^9, c≤10^9, a[i]<p, p 是质数

前言:由于上次发挥人类智慧居然有人和我一样发挥了,我很生气,所以我又发挥了一次人类智慧。

看到这道题,明显是双向搜索题目。

但是,我们充分发挥人类智慧,由于我们可以利用 \mod p 的乘法性质,将问题转化为动态规划, 因为乘积 \mod p 的结果最多 p 种可能,明显用数组就会爆,所以我们发挥人类机会,没错,哈希表可以解决这个问题。这时,我们再发挥一下人类智慧,可以只维护前一个空间(没错就是滚动优化)。这时速度快的飞起,只需要 O(n \times p) 的时间复杂度就可以做出来,完全可以在 10ms 内解决问题!

PS:如果使用折半搜索,时间复杂度为 O(n\times2^{\frac{n}{2}})。经过与 DP 解法的对比,当 p 达到 2^{16} 后,折半搜索更优。

1 个赞

这诗人握持啊