Luogu U13059 某种密码
应该没什么用的题目链接
题目背景
关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY。若KEY=∑▒〖Ai*Bi〗,则密文就是原文的一组合法密码。
题目描述
现在有原文和钥匙码,请编一个程序来帮助他统计到底有多少个符合条件的密文。
输入输出格式
输入格式:
第一行两个数N,KEY,意义同题目描述;
第二行N个数表示原文A,意义同题目描述。
输出格式:
一个数ANS,表示对于原文A和KEY,有多少组可行的密文B。
输入输出样例
3 2
1 1 2
2
说明
【样例说明】
密文110,1*1+1*1+0*2=2
密文001,0*1+0*1+1*2=2
一共两组可行的密文。
【数据范围】
60%数据满足N<=25
100%数据满足N<=40,-maxlongint<=∑▒Ai<=maxlongint
题解:
这道题可以理解为一个01背包问题的变种,n为物品个数,原文为物品的重量,钥匙码为背包容量,求恰好装满背包的方案数。
如果是一道普通01背包求恰好装满背包的方案数的题,可以用DP求解。具体思路是设f[i][j]为用前i个物品恰好装满容量为j的背包的方案数,转移方程为f[i][j]=f[i-1][j]+f[i-1][j-w[i]]。显然可以滚动数组或一维数组优化,在此不再赘述。
然而,观察数据范围会发现,此处物品的重量极大,达到了int的范围,因此DP的时空复杂度均无法承受,然而n的范围较小,可以考虑搜索。
60分做法:
直接暴搜,O(2n)枚举放入背包的物品集合,将重量相加并与key比较。然而,对于剩余的40%数据,复杂度太大,仍然无法解决。
100分做法:
注意到这是一类经典问题,即从一个集合中选取某个子集,使其中所有元素值之和等于某个给定值。可以使用以空间换时间的折半枚举。类似思想也在BSGS中得到应用。
将物品集合均分成两个交集为空,补集为全集的集合A、B,对集合A暴力枚举其所有子集中元素和并存入哈希表(可重集),再对集合B暴力枚举每个子集的元素和s,同时查找哈希表中值为(key-s)的元素个数并计数。时间复杂度为O(2*2n/2)=O(2n/2),可以接受。
注意此处用到的哈希表如果使用STL代替的话,不能使用set,要用multiset或map,然而multiset速度极慢不推荐使用,map速度也稍慢,有被卡1~2个点的风险。不过我自己写的哈希表写挂了只能用map
代码:
1 #include<bits/stdc++.h>
2 #define h(x) (x%MOD)
3 #define LL long long
4 using namespace std;
5 const LL maxn=100,maxm=4e6+10,maxk=1e5+10,MOD=1e5+3;
6 map<int,int>isvis;
7 LL a[maxn];
8 LL n,key,mid,tot=0;LL ans=0;
9 int main()
10 {
11 LL i,j,k,l,r,tmp;
12 cin>>n>>key;
13 //l=n/2;r=n-l;
14 mid=(1+n)>>1;l=mid;r=n-l;
15 for(i=1;i<=n;i++){scanf("%d",&a[i]);}
16 for(k=0;k<(1<<l);k++)
17 {
18 tmp=0;
19 for(i=0;i<l;i++){if(k&(1<<i)){tmp+=a[i+1];}}
20 isvis[tmp]++;
21 }
22 for(k=0;k<(1<<r);k++)
23 {
24 tmp=0;
25 for(i=0;i<r;i++){if(k&(1<<i)){tmp+=a[l+i+1];}}
26 ans+=isvis[key-tmp];
27 }
28 cout<<ans;
29 return 0;
30 }
PS:
此外,还有一类01背包的变种。这类问题中物品个数与普通01背包类似,物品重量与背包容量极大,但物品单个价值较小,求装入背包的物品价值的最大值。
此类问题可以用DP求解,只是需要对状态进行些许修改。设f[i][j]为前i个物品价值总量为j时所需的背包容量的最小值,状态转移方程为f[i][j]=min(f[i-1][j],f[i-1][j-c[i]]+w[i])。最后扫描f[n][i],找到最接近给定背包容量的i输出即可。
Luogu U13059 某种密码的更多相关文章
- 黄学长模拟day1 某种密码
关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY.若KEY=∑▒[Ai*Bi],则密文就是原文的一组合法密码. 现在有原 ...
- 某种密码(password.*)
关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY.若KEY=∑▒[Ai*Bi],则密文就是原文的一组合法密码.现在有原文 ...
- [Luogu] 外星密码
https://www.luogu.org/problemnew/show/P1928 沙比提 读清题目 #include <bits/stdc++.h> using namespace ...
- luogu P3279 [SCOI2013]密码
LINK:密码 给出来manacher的数组 让还原出字典序最小的字符串.字符集为小写字母. 当没有任何限制时 放字典序最小的'a'.如果此时还在最长的回文串中的话那么 直接得到当前字符即可. 注意这 ...
- 2018.11.01 NOIP训练 某种密码(折半搜索)
传送门 直接折半搜索,把所有和装到unorderedmapunordered_mapunorderedmap里面最后统计答案就行了. 然后考试的时候读优并没有处理有负数的情况于是爆零了 代码
- 如何利用神经网络和Python生成指定模式的密码
今天给大家介绍的是Github上一个名叫PyMLProjects的项目,这个项目的目的是为了训练AI来学习人类构造密码的模式,然后我们就可以用AI来生成大量同一模式或种类的密码了.这种方法也许可以用来 ...
- 9.30 noip模拟试题
时限均为1s,内存 256MB 1.某种密码(password.*) 关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY. ...
- SSL/TLS通信
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/31 复习基本概念 对称密码:加密和解密使用同一密匙. 公钥密码: ...
- OSI模型和TCP/IP协议族(一)
1990年以前,再数据通信和组网文献中占主导地位的分层模型是开放系统互连(Open System Interconnnection,OSI)模型.当时所有人都认为OSI模型将是数据通信的最终标准,然而 ...
随机推荐
- 【windows】快捷键
Ctrl+字母键 1.Ctrl+A:全选 2.Ctrl+C:复制选择的项目 3.Ctrl+E:选择搜索框 4.Ctrl+F:选择搜索框 5.Ctrl+N:创建新的项目 6.Ctrl+W:关闭当前窗口 ...
- CVE-2020-0796复现
今天整理资料时发现了之前存的一个cve漏洞复现过程,当时打算跟着复现来着,后来也没去复现,今天刚好有时间,所以来复现一下这个漏洞 漏洞讲解 https://www.freebuf.com/vuls/2 ...
- 汇编学习笔记——DOS及DEBUG介绍
转自:https://www.shiyanlou.com/courses/running/332 一.课程简介 声明:该课程基于<汇编语言(第2版)>郑晓薇 编著,机械工业出版社.本节实验 ...
- oralce move和shrink释放高水位
转自:https://blog.51cto.com/fengfeng688/1955137 move和shrink的共同点: 收缩段,消除部分行迁移,消除空间碎片,使数据更紧密 shrink用法: 语 ...
- Promise.all()使用实例
一.什么是Promise.all()? 在说这个之前要先说清楚promise.promise就是一个对象,专门用来处理异步操作的. 而Promise.all方法用于将多个 Promise 实例,包装成 ...
- Kioptrix Level 2
简介 Vulnhub是一个提供各种漏洞环境的靶场平台. 个人学习目的:1,方便学习更多类型漏洞.2,为OSCP做打基础. 下载链接 https://www.vulnhub.com/entry/kiop ...
- Eclipse中的可视化图形界面设计插件windowbuilder
对于eclipse平台上的可视化开发工具插件,有windowbuilder.visual editor等,今天就对windowbuilder说明: WindowBuilder功能特性等介绍,参考如下网 ...
- [usaco2008 Oct]Pasture Walking 牧场旅行
题目描述 n个被自然地编号为1..n奶牛(1<=n<=1000)正在同样被方便的编号为1..n的n个牧场中吃草.更加自然而方便的是,第i个奶牛就在第i个牧场中吃草. 其中的一些对牧场被总共 ...
- .NET Core使用Source Link提高源代码调试体验和生产效率
前言: 在我们日常开发过程中常常会使用到很多其他封装好的第三方中间件(NuGet依赖项).类库或者是.NET框架中自带的库.但是当你想要对这些类库的方法设置断点调试,然后发现无法F11(逐语句)调试进 ...
- Linq.Expressions扩展ExpressionExtension
手上有一个以前项目用到的.NET工具类封装的DLL. 正好又想试一下动态LAMBDA表达式,用.NET Reflector看一下源码. public static class ExpressionEx ...