【NOIP2011模拟9.20】统计方案

这是一篇关于NOIP2011模拟赛的统计方案问题的解题报告。文章介绍了如何在限定时间内,根据给定的n个正整数和模p的情况下,找出所有可能的数的乘积模p余c的取数方案。题目要求计算方案总数并模1000000007。解题策略包括了针对30%数据的直接枚举和100%数据的折半搜索与扩展欧几里得算法的应用。
摘要由CSDN通过智能技术生成

【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,要想成立,则有 abc(m

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值