[一本通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]一文中,我们介绍了如何使用自定义的工具链,来针对性优化调试器的性能,解决大型 ...
随机推荐
- day05---系统的重要文件(3)
1) /usr/local 编辑 安装的软件 第三方软件安装位置 软件安装的三种方法 1.yum安装 自动解决依赖问题 yum [选项参数] 包名 第一个里程碑:我想要安装的软件的名字 或者是 知道命 ...
- opencv库图像基础4绘图-python
opencv库图像基础4绘图-python 1.绘画线条和简单图形 创建颜色字典和一个画布 import cv2 import numpy as np import matplotlib.pyplot ...
- Java 客户信息管理软件 (面向对象 封装 总结)
1 package com.bytezero.cim.bean; 2 3 /** 4 * 5 * @Description Customer为实体对象,用来封装客户信息 6 * @author Byt ...
- Web常见漏洞描述及修复建议(转载)
Web常见漏洞描述及修复建议 我太难了king 白帽聚集地 1 week ago 1.SQL注入 漏洞描述 Web程序中对于用户提交的参数未做过滤直接拼接到SQL语句中执行,导致参数中的特殊字符破坏了 ...
- 离线部署-docker
离线部署---docker 关键词:docker离线部署,images离线安装,docker compose,shell,minio docker离线安装 docker install offline ...
- 开源:基于mybatis和jpa的数据库安全加密脱敏插件,围观交流
开源:基于mybatis和jpa的数据库安全加密脱敏插件,围观交流
- vscode 函数注释方法 输入 /** 回车 自动就出来了
vscode 函数注释方法 输入 /** 回车 自动就出来了
- Template String Converter - 字符串中加变量 自动将单引号变换 - vscode插件
Template String Converter - 字符串中加变量 自动将单引号变换 - vscode插件
- 音标 重音 u 用 中文 吁 去记忆 骑马让马停下来的 吁 - 英语
音标 重音 u 用 中文 吁 去记忆 骑马让马停下来的 吁
- vue 的属性展开 props v-bind 记得带key
<el-table-column v-for="column in columns" :key="column.prop" v-bind="co ...