题目描述

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

你能帮他计算一下一共有多少种取数方案吗?请把最后的方案数模\(1000000007\)后输出。

小\(B\)记得他至少取了一个数。

输入

第一行三个正整数\(n,p,c\),含义如题目所述。

接下来一行有\(n\)个正整数,表示生成的\(n\)个随机数。

输出

一行一个数,方案数模\(1000000007\)。

输入样例

2 7 2
1 2

输出样例

2

提示

数据规模与约定

  1. 对于30%的数据,\(n≤16\)。
  2. 另有30%的数据,\(p≤10000\)。
  3. 对于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。根据费马小定理,推导可以知道

\[b=a^{p-2}\times c\mod p
\]

这里还可以用快速幂来优化。

当然有些情况需要特判。在代码里会说明。

代码

#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与逆元的结合)的更多相关文章

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

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

  2. [XJOI]noip40 T2统计方案

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

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

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

  4. Java实现统计方案

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

  5. 【2-SAT】【并查集】NOIp模拟题 植树方案 题解

        一个类似2-SAT的思想,但是简化了很多.只需要用到并查集实现. 题目描述 企鹅国打算种一批树.所谓树,就是由$N$个结点与$N-1$条边连接而成的连通无向图.企鹅国的国王对于这些树有下列要求 ...

  6. [Project Euler 409] Nim Extreme 解题报告 (统计方案数)

    题目链接:https://projecteuler.net/problem=409 题目: 题解: 题目问你必胜态的数目,我们考虑用总的方案数减去必败态的方案数(NIM游戏没有平局这个操作) 必败态的 ...

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

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

  8. Bzoj 1079 着色方案 题解

    1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2237  Solved: 1361[Submit][Stat ...

  9. 贪心整理&一本通1431:钓鱼题解

    题目传送 (其实有一个更正经的题解) 看了许久,发现这题貌似就是一个动态规划啊,但毕竟是贪心题库里的题,还是想想用贪心解吧. 经过(借鉴大佬思路)十分复杂的思考后,终于理解出了这题的贪心思路.该题的难 ...

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

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

随机推荐

  1. django学习第十四天--Forms和ModelForm

    Forms和ModelForm 进行数据校验,先看数据校验的过程 注册页面图解: 前端为了用户体验会做一些校验,不满足校验要求会报错 服务端也会对数据进行一些校验,不满足校验要求会报错 数据库也会对数 ...

  2. js之以面向对象的形式书写贪吃蛇

    此代码存在一定的小bug,当蛇出边界之后存在一定的小问题 分析贪吃蛇功能需求: 1.食物 (1)每次生成一个,位置随意但不可超出规定范围 (2)每次蛇吃到食物之后,前一个食物消失同时新的食物又生成 ( ...

  3. 智能升级:AntSK教你如何让聊天机器人实现智能联网操作

    随着人工智能技术的飞速发展,智能体已经逐步融入到我们的日常生活中.不过,要想让智能体不仅能聊天,还能接入网络实时获取信息,为我们提供更多便利,所需技术的复杂性不得不让人瞩目.今天,我将和各位分享如何在 ...

  4. 国内RPA融资年终大盘点:19起投资总额破34亿估值近230亿,垂直落地之年开启

    2021国内RPA融资年终盘点:15家厂商融资总额破34亿,估值近230亿 2021RPA融资年终大盘点:19起投资估值近230亿,垂直落地之年开启 2021国内RPA融资年终盘点:15家厂商19起投 ...

  5. axios 报 登出跨域 withCredentials: false,

    withCredentials: false, 默认值虽然是false,但是之前包装的时候设置成true了,所以最后再设置回来

  6. dist目录打war包命令 jar -cvf yourName_web.war *

    进入dist目录 "build:war": "cd dist && jar -cvf ../yourName_web.war *",

  7. labeImg 遇到闪退问题,TypeError: setValue(self, a0: int): argument 1 has unexpected type 'float'

    将python 环境安装为python3.9,然后重新安装labelImg

  8. android使用StringRequest访问网站接收JSON时空指针报错

    報錯詳情: 代碼詳情: 报错原因:他丫变量名与JSON格式中的变量名不同

  9. spring boot2集成api文档工具swagger-ui(下)

    接上篇 swaggerUI提供了可视化界面帮助我们管理服务的访问路口,这就需要我们在代码中规范我们的书写格式.并且在swagger的界面上还能够模拟浏览器对服务进行访问. 接口总览 创建POST接口 ...

  10. TCP可靠传输的保证

    我们知道传输层提供最主要的两种协议,TCP和UDP,其中TCP是保证可靠传输,为什么他要保证可靠传输呢,IP说:当然是我不能,我只提供尽力而为的服务,不保证你能不能交付,不保证能不能正确的交付,不保证 ...