【NOIP2011模拟9.20】统计方案
Time Limits: 1000 ms Memory Limits: 262144 KB
Description
小B写了一个程序,随机生成了n个正整数,分别是a[1]..a[n],他取出了其中一些数,并把它们乘起来之后模p,得到了余数c。但是没过多久,小B就忘记了他选了哪些数,他想把所有可能的取数方案都找出来。你能帮他计算一下一共有多少种取数方案吗?请把最后的方案数模1000000007后输出。
小B记得他至少取了一个数。
Input
第一行三个正整数n,p,c,含义如题目所述。
接下来一行有n个正整数,表示生成的n个随机数。
Output
一个数,方案数模1000000007。
Sample Input
3 7 2
1 2 4
Sample Output
2
Hint
- 对于30%的数据,n<=16;
- 另有30%的数据,p<=10000;
- 对于100%的数据,n<=32,p<=10^9,c<=10^9,a[i]
解题思路
这一道题我们一看就可以想到前三十分的做法,直接枚举选与不选,O(2^n)解决。
100分的方法其实很简单,折半搜索,我们先暴力前n/2个,哈希储存,然后再暴力另外的n/2个,我们就可以搜索到前半组的乘积模p余c的个数,和后半组的个数,那么,我们可以枚举前半组出现的余数a,若后半组中的一段数乘积为b,要想成立,则有 a∗b≡c(m