统计方案

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

输入格式:

第一行三个正整数n,p,c,含义如题目所述。
接下来一行有n个正整数,表示生成的n个随机数。

输出格式:

一个数,方案数模1000000007。

样例输入:

2 7 2

1 2

样例输出:

2

数据范围:

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

 
解题思路:
看到这种n <=32的数据范围,其实很多大佬都可以猜到这是中途相遇法
***如果知道这个的可以跳过下面这段介绍
中途相遇法:事实上就是进行两次dfs,在第一次dfs时记录下搜索到的结果,
一般用map或者hash,然后第二次是在dfs结束时根据上一次的结果,记录答案
***然后是对于这道题的介绍
你先dfs前(n/2)个数,选或不选,结束时记录这些数的乘积a,我是用map来记录的
然后在dfs后(n/2)个数,同样是选或不选,结束时得到这些数的乘积为b
因为a*b%p=c,所以我们可以用(c/b)在%p意义下的逆元就是a的值
最后再返回到原来的map里面找
如果没看懂,可以借助程序在思考一下
***注意:(1)因为不能不取,所以在c=1的时候,答案要减一
(2)c有可能大于等于p,这种情况直接输出0
%:pragma GCC optimize()
#include<bits/stdc++.h>
#define int long long
#define czx 1000000007
using namespace std;
int ans=,a[],n,p,c,m;
map <int,int> mp;
int pow(int a){
int res=,b=p-;
while (b){
if (b&) res=(res*a)%p; b/=; a=(a*a)%p;
}
return res;
}
inline void dfs(int x,int s){
if (x==m+){
mp[s]++; return;
}
dfs(x+,s); dfs(x+,1ll*s*a[x]%p);
}
inline void dfs1(int x,int s){
if (x==n+){
int a=c*pow(s)%p;
ans=(ans+mp[a])%czx; return;
}
dfs1(x+,s); dfs1(x+,1ll*s*a[x]%p);
}
main(){
scanf("%lld%lld%lld",&n,&p,&c);
if (c>=p){
puts(""); return ;
}
for (int i=;i<=n;++i)
scanf("%lld",&a[i]);
m=n/; dfs(,); dfs1(m+,);
if (c==) ans--; printf("%lld",ans);
}

最后再给上几道中途相遇法的题目

[XJOI]noip40 T2统计方案的更多相关文章

  1. 【NOIP模拟赛】chess 建图+spfa统计方案数

    似乎弗洛伊德和迪杰斯特拉都干不了统计方案数,spfa的话就是不断入队就好. #include <cstdio> #include <cstring> #include < ...

  2. Android Activity启动耗时统计方案

    作者:林基宗 Activity的启动速度是很多开发者关心的问题,当页面跳转耗时过长时,App就会给人一种非常笨重的感觉.在遇到某个页面启动过慢的时候,开发的第一直觉一般是onCreate执行速度太慢了 ...

  3. Java实现统计方案

    统计方案 题目描述 在一无限大的二维平面中,我们做如下假设: 1.每次只能移动一格: 2.不能向后走(假设你的目的地是"向上",那么你可以向左走,可以向右走,也可以向上走,但是不可 ...

  4. XJOI 夏令营501-511测试11 统计方案

    小B写了一个程序,随机生成了n个正整数,分别是a[1]..a[n],他取出了其中一些数,并把它们乘起来之后模p,得到了余数c.但是没过多久,小B就忘记他选了哪些数,他想把所有可能的取数方案都找出来.你 ...

  5. C/C++应用程序内存泄漏检查统计方案

    一.前绪 C/C++程序给某些程序员的几大印象之一就是内存自己管理容易泄漏容易崩,笔者曾经在一个产品中使用C语言开发维护部分模块,只要产品有内存泄漏和崩溃的问题,就被甩锅“我的程序是C#开发的内存都是 ...

  6. 字节跳动 DanceCC 工具链系列之Xcode LLDB耗时监控统计方案

    作者:李卓立 仲凯宁 背景介绍 在<字节跳动 DanceCC 工具链系列之Swift 调试性能的优化方案>[1]一文中,我们介绍了如何使用自定义的工具链,来针对性优化调试器的性能,解决大型 ...

  7. CodeForces 567C Geometric Progression 类似dp的递推统计方案数

    input n,k 1<=n,k<=200000 a1 a2 ... an 1<=ai<=1e9 output 数组中选三个数,且三个数的下标严格递增,凑成形如b,b*k,b* ...

  8. 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】

    P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...

  9. [XJOI]noip43 T2多人背包

    多人背包 DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是相同的,都是 V.可以装进背包里的一共有 N 种物品,每种物品都有给定的体积和价值.在 DD 看来,合理的 ...

随机推荐

  1. Repeater + 分页控件 AspNetPager 研究

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs ...

  2. 题解 P3258 【[JLOI2014]松鼠的新家】(From luoguBlog)

    唯一能得分的题也被自己搞炸了,好的. 考场上读完题基本认定和lca脱不了干系,想了一会确认是树剖. 那么问题来了,考前一节课刚发现自己之前打的树剖是错的. 而且就算是错的我也没信心考场调出来. 于是打 ...

  3. python tips:小整数对象池与字符串intern

    本文为is同一性运算符的详细解释.is用于判断两个对象是否为同一个对象,具体来说是两个对象在内存中的位置是否相同. python为了提高效率,节省内存,在实现上大量使用了缓冲池技术和字符串intern ...

  4. pymysql.err.ProgrammingError: (1064)(字符串转译问题)

    代码: sql = "insert into dm_copy(演出类型,演出场馆,剧目名称,演出地点,演出时间,演出票价,演出团体,创建时间, url)values('%s','%s','% ...

  5. centos7安装mwget下载资源,提升下载速度

    1.安装mwget wget http://jaist.dl.sourceforge.net/project/kmphpfm/mwget/0.1/mwget_0.1.0.orig.tar.bz2 ta ...

  6. POJ2431-Expedition【优先队列+贪心】

    题目大意:卡车每走一公里就消耗一单位的汽油,初始时给你p单位油,你要到达l距离的终点.其中路上有n个补给点可以加油,并且油箱容量无限大,问你最少可以停车几次. 思路:因为油箱无限大,所以我们可以这么认 ...

  7. 51nod1183 编辑距离【动态规划】

    编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除 ...

  8. echarts常用实例

    1.柱状图: 1.需要动态加载的参数是x轴以及柱状图的数值,legendData和seriesData.demo使用是可以直接写死参数,在执行this.initChart()方法即可.具体代码可以参数 ...

  9. Git 基础教程 之 远程库更新到本地

    PS:git remote -v 查看远程仓库        git diff temp 比较master 分支与temp的不同 如果分支没有合并到主分支上,用        git branch - ...

  10. Java代码规范和一些常见问题

       本文中的代码规范,是Java标准代码规范中的一小部分,在我看来,是最重要的一部分.    理想目标:不需要写注释,不需要和别人介绍,别人就知道你的项目大致是做什么的,每个类大概实现了什么功能. ...