[一本通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]一文中,我们介绍了如何使用自定义的工具链,来针对性优化调试器的性能,解决大型 ...
随机推荐
- ASP.NET Core MVC应用模型的构建[3]: Controller的收集
从编程的角度来看,一个MVC应用是由一系列Controller类型构建而成的,所以对于一个代表应用模型的ApplicationModel对象来说,它的核心就是Controllers属性返回的一组Con ...
- 基于Vue(提供Vue2/Vue3版本)和.Net Core前后端分离、强大、跨平台的快速开发框架
前言 今天大姚给大家推荐一款基于Vue(提供Vue2/Vue3版本)和.Net Core前后端分离.开源免费(MIT License).强大.跨平台的快速开发框架,并且框架内置代码生成器(解决重复性工 ...
- DataGear数据可视化分析平台介绍
DataGear 是一款开源免费的数据可视化分析平台,自由制作任何您想要的数据看板,支持接入SQL.CSV.Excel.HTTP接口.JSON等多种数据源. 系统特点: 友好的数据源接入 支持运行时接 ...
- web模块化
CommonJS-----是一种后端js规范,是nodejs遵循的一种编写js模块的规范引入模块-------require('模块路径')定义模块 ------ exports.模块名= funct ...
- 【Azure 应用服务】App Service For Linux 怎么安装Composer,怎么安装PHP扩展,怎么来修改站点根路径启动程序?
问题一:App Service 的默认启动路径为wwwroot,如何修改到到PHP代码运行目录呢? 如Laravel的启动目录为public/?那如何修改呢? App Service 的默认 PHP ...
- python执行JavaScript代码出现编码问题的解决方案
当我们安装好nodejs环境,想在python代码中去调用JavaScript代码,常常会出现编码的问题. 举个例子: python代码如下: 点击查看代码 import execjs f = ope ...
- Advanced .Net Debugging 3:基本调试任务(上)
一.简介 这是我的<Advanced .Net Debugging>这个系列的第三篇文章.这个系列的每篇文章写的周期都要很长,因为每篇文章都是原书的一章内容(太长的就会分开写).再者说,原 ...
- 分组聚合不再难:Pandas groupby使用指南
处理大量数据时,经常需要对数据进行分组和汇总,groupby为我们提供了一种简洁.高效的方式来实现这些操作,从而简化了数据分析的流程. 1. 分组聚合是什么 分组是指根据一个或多个列的值将数据分成多个 ...
- 文心一言 VS 讯飞星火 VS chatgpt (209)-- 算法导论15.4 6题
六.设计一个 O(nlgn) 时间的算法,求一个 n 个数的序列的最长单调递增子序列.(提示:注意到,一个长度为 i 的候选子序列的尾元素至少不比一个长度为 i-1 候选子序列的尾元素小.因此,可以在 ...
- vue3自定义Hooks
比较简单的小demo,直接上代码吧 ts使用defineComponent,setup()里面使用 Composition API 写法,逻辑块清晰,不用前后文查找,拒绝 spaghetti code ...