[一本通1681]统计方案 题解(Meet in mid与逆元的结合)
题目描述
小\(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]\lt p\),其中\(p\)是质数。
思路
如果采用传统暴力搜索\(2^{32}\)肯定受不了。由于这个复杂度是由\(2\)为底,所以可以试一下Meet in mid算法。复杂度是\(O(2\times 2^{16})\),可以通过。
首先Dfs把前16个数字所有的情况存起来,我这里用的是\(HashMap\)存起来。
再利用第二次Dfs把后16个数字的情况算出来,同时找出对应的前16个数字,使得\(a \times b\mod p=c\)这里我们知道a,求b。根据费马小定理,推导可以知道
\]
这里还可以用快速幂来优化。
当然有些情况需要特判。在代码里会说明。
代码
#include <iostream>
#include <tr1/unordered_map>
#include <cstdio>
using namespace std;
using namespace tr1;
typedef long long ll;
const int N = 33;
const ll MOD = 1e9 + 7;
ll num[N];
unordered_map<ll, int> M;
int n, c;
ll p;
inline ll Qpow(ll a, ll n, ll mod)
{
ll ans = 1;
while (n)
{
if (n & 1)
ans = ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return ans;
}
void dfs1(int u, ll times)
{
if (u > n / 2)
{
M[times]++;
return;
}
dfs1(u + 1, times * num[u] % p);
dfs1(u + 1, times);
}
ll cnt = 0;
void dfs2(int u, ll times)
{
if (u > n)
{
cnt = (cnt + M[c * Qpow(times, p - 2, p) % p]) % MOD;
return;
}
dfs2(u + 1, times * num[u] % p);
dfs2(u + 1, times);
}
int main()
{
cin >> n >> p >> c;
if (c >= p) //不合理的情况
{
printf("0");
return 0;
}
for (int i = 1; i <= n; i++)
cin >> num[i];
dfs1(1, 1);
dfs2(n / 2 + 1, 1);
if (c == 1) //会把不选数统计进去
cnt--;
printf("%lld", cnt);
return 0;
}
[一本通1681]统计方案 题解(Meet in mid与逆元的结合)的更多相关文章
- 【NOIP模拟赛】chess 建图+spfa统计方案数
似乎弗洛伊德和迪杰斯特拉都干不了统计方案数,spfa的话就是不断入队就好. #include <cstdio> #include <cstring> #include < ...
- [XJOI]noip40 T2统计方案
统计方案 小B写了一个程序,随机生成了n个正整数,分别是a[1]..a[n],他取出了其中一些数,并把它们乘起来之后模p,得到了余数c.但是没过多久,小B就忘记他选了哪些数,他想把所有可能的取数方案都 ...
- Android Activity启动耗时统计方案
作者:林基宗 Activity的启动速度是很多开发者关心的问题,当页面跳转耗时过长时,App就会给人一种非常笨重的感觉.在遇到某个页面启动过慢的时候,开发的第一直觉一般是onCreate执行速度太慢了 ...
- Java实现统计方案
统计方案 题目描述 在一无限大的二维平面中,我们做如下假设: 1.每次只能移动一格: 2.不能向后走(假设你的目的地是"向上",那么你可以向左走,可以向右走,也可以向上走,但是不可 ...
- 【2-SAT】【并查集】NOIp模拟题 植树方案 题解
一个类似2-SAT的思想,但是简化了很多.只需要用到并查集实现. 题目描述 企鹅国打算种一批树.所谓树,就是由$N$个结点与$N-1$条边连接而成的连通无向图.企鹅国的国王对于这些树有下列要求 ...
- [Project Euler 409] Nim Extreme 解题报告 (统计方案数)
题目链接:https://projecteuler.net/problem=409 题目: 题解: 题目问你必胜态的数目,我们考虑用总的方案数减去必败态的方案数(NIM游戏没有平局这个操作) 必败态的 ...
- C/C++应用程序内存泄漏检查统计方案
一.前绪 C/C++程序给某些程序员的几大印象之一就是内存自己管理容易泄漏容易崩,笔者曾经在一个产品中使用C语言开发维护部分模块,只要产品有内存泄漏和崩溃的问题,就被甩锅“我的程序是C#开发的内存都是 ...
- Bzoj 1079 着色方案 题解
1079: [SCOI2008]着色方案 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2237 Solved: 1361[Submit][Stat ...
- 贪心整理&一本通1431:钓鱼题解
题目传送 (其实有一个更正经的题解) 看了许久,发现这题貌似就是一个动态规划啊,但毕竟是贪心题库里的题,还是想想用贪心解吧. 经过(借鉴大佬思路)十分复杂的思考后,终于理解出了这题的贪心思路.该题的难 ...
- 字节跳动 DanceCC 工具链系列之Xcode LLDB耗时监控统计方案
作者:李卓立 仲凯宁 背景介绍 在<字节跳动 DanceCC 工具链系列之Swift 调试性能的优化方案>[1]一文中,我们介绍了如何使用自定义的工具链,来针对性优化调试器的性能,解决大型 ...
随机推荐
- centos8.x阿里源配置
>>> cd /etc/yum.repo.d >>> mkdir bak >>> mv *.repo bak/ >>> cd b ...
- win终端利器-Cmder的安装使用
cmder 官网:https://cmder.app/ 安装 直接选择full版本下载,完成后解压即可 启动 直接双击Cmder.exe 如果每次都进入到 Cmder 解压目录双击 Cmder.exe ...
- 合并区间(区间排序,vector的动态扩容的应用)
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] .请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入 ...
- CXP2.0的相机是否可以使用CXP1.1的Grabber
可以 答案是肯定的. 目前CXP共有2个发布版本: 2011年发布CXP1.1 2021年发布CXP2.1,向后兼容,新标准增加了同步功能.数据率放大了一倍. 只要是符合CXP标准.接插件匹配,那么C ...
- Java --- 多线程 创建线程的方式四: 使用线程池
1 package bytezero.thread2; 2 3 import java.security.Provider; 4 import java.util.concurrent.Executo ...
- gitee的 私人令牌 就是 Gitee Open API 的 access_token
gitee的 私人令牌 就是 Gitee Open API 的 access_token
- 恒玄科技BES250解决方案之双耳链接调试总结和源码分析
一 前言 bes2500芯片在tws耳机应用十分广泛,该芯片有着资源强大,音质好,大厂背书等特色.吸引了不少粉丝跟随. 最近在调试该芯片的tws配对流程,花费了一些时间,踩了一些坑,这里做一个总结和备 ...
- 几个常用的cmd命令
compmgmt.msc 计算机管理 devmgmt.msc 设备管理器 diskmgmt.msc 磁盘管理工具 dfrg.msc 磁盘碎片整理 eventvwr.msc 事件查看器 fsm ...
- LeNet-5 论文及原理分析(笨鸟角度)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- NJUPT第一次积分赛
NJUPT第一次积分赛 最近在忙第二次积分赛以及一些很复杂的队友关系(人际关系好复杂,好想电赛出个单机模式),但最后结果还是很满意的. 突然想起来第一次积分赛写的屎山,遂拿出来给大火闻闻 没啥很新颖的 ...