题意:

给你32个物品,给定一个容积,让你恰好把这个背包装满,求出装满的方案

题解:

暴力计算的话,复杂度$2^{32}$肯定会炸,考虑一种类似bsgs的算法,先用$2^{16}$的时间遍历前一半物品的所有子集,将所得结果存进map里,再遍历后一半物品的子集,每得到一个解,在map里查询有没有相加正好得到背包大小的解。总时间复杂度$2^{16}log2^{16}=16*2^{16} \approx 1e6$

#include<iostream>
#include<map>
#define ULL unsigned long long
using namespace std;
void bind(int k,int n){
while(n--){
printf("%d",k&);
k>>=;
}
}
ULL a[];
map<ULL,int> mapp;
int main(){
int n;
ULL ans;
scanf("%d %lld",&n,&ans);
for(int i=;i<=n;i++)scanf("%lld",&a[i]);
int h=n/;
int w=<<h;
int i=;
while(!(i&w)){
ULL sum=;
for(int j=;j<=h;j++){
if((<<(j-))&i)sum+=a[j];
}
mapp[sum]=i;
i++;
}
w=<<(n-h);
i=;
while(!(i&w)){
ULL sum=;
for(int j=;j<=n-h;j++){
if((<<(j-))&(i))sum+=a[j+h];
}
map<ULL,int>::iterator it=mapp.find(ans-sum);
if(it!=mapp.end()){
bind(it->second,h);
bind(i,n-h);
printf("\n");
break;
}
i++;
}
return ;
}

拓展知识:背包公钥密码体系

背包公钥密码体系是利用背包问题(子集和问题)的NP完全性保证安全性的密码体系。

私钥持有者Alice找一个超递增序列,即某位大于前面所有位之和。比如M={3,11,24,50,115}

在超递增序列上求解求解背包是十分容易的,只需从后往前贪心即可,此结论留给读者自证。

私钥部分除了超递增序列,还有一个乘数r和模数m,需要保证r在模m意义下有逆元。通过私钥计算公钥的过程实际上是把超递增序列伪装成一个非超递增序列的过程。

伪装过程,就是把M的每一位乘r模m。比如令r=113,m=250,则M'=M*113%250={89,243,212,150,245}

这个M'就是公钥。

Bob获得了公钥,要给Alice发送一段消息,假设明文为x={1,0,1,0,1},将公钥和明文做个内积就得到了密文,s=1*89+0*243+1*212+0*150+1*245=546

Alice知道了密文后,将密文模乘r的逆元,$s*r^{-1}$ $mod$ $m=546*117$ $mod$ $250=142$,再在M上贪心即可。

而第三方得知了公钥和密文后,需要花费$n*2^{n/2}$时间才可解出明文。

牛客多校第九场 D Knapsack Cryptosystem 背包的更多相关文章

  1. 2019牛客多校第⑨场D Knapsack Cryptosystem(折半搜索)

    原题:https://ac.nowcoder.com/acm/contest/889/D 题意: 给定大小为n(<=36)的集合a,整数s,求a的一个和为s的子集(有且只有一个) 思路: 直接搜 ...

  2. 牛客多校第九场 && ZOJ3774 The power of Fibonacci(二次剩余定理+斐波那契数列通项/循环节)题解

    题意1.1: 求\(\sum_{i=1}^n Fib^m\mod 1e9+9\),\(n\in[1, 1e9], m\in[1, 1e4]\) 思路1.1 我们首先需要知道斐波那契数列的通项是:\(F ...

  3. Cutting Bamboos(2019年牛客多校第九场H题+二分+主席树)

    题目链接 传送门 题意 有\(n\)棵竹子,然后有\(q\)次操作,每次操作给你\(l,r,x,y\),表示对\([l,r]\)区间的竹子砍\(y\)次,每次砍伐的长度和相等(自己定砍伐的高度\(le ...

  4. 2018牛客多校第九场E(动态规划,思维,取模)

    #include<bits/stdc++.h>using namespace std;const long long mod=1000000007,inv=570000004;long l ...

  5. 2019牛客多校第九场AThe power of Fibonacci——扩展BM

    题意 求斐波那契数列m次方的前n项和,模数为 $1e9$. 分析 线性递推乘线性递推仍是线性递推,所以上BM. 由于模数非质数,上扩展版的BM. 递推多少项呢?本地输入发现最大为与前57项有关(而且好 ...

  6. 牛客多校第九场 J Symmetrical Painting 计算几何/扫描线

    题意: 平面上有几个宽度相同的矩形区域被涂黑了,让你找到一条横线横截若干个矩形,把这些黑色部分抠下来一部分使得它们以这条横线为对称轴,求能抠下来的最大面积. 题解: 在随着对称轴上移的过程中,必然有一 ...

  7. 牛客多校第九场 A The power of Fibonacci 杜教bm解线性递推

    题意:计算斐波那契数列前n项和的m次方模1e9 题解: $F[i] – F[i-1] – F[i-2] = 0$ $F[i]^2 – 2 F[i-1]^2 – 2 F[i-2]^2 + F[i-3] ...

  8. 牛客多校第九场 E All men are brothers 并查集/组合论

    题意: 一开始有n人互不认识,每回合有两个人认识,认识具有传递性,也就是相互认识的人组成小团体.现在问你每个回合,挑选四个人,这四个人互不认识,有多少种挑选方法. 题解: 认识不认识用并查集维护即可, ...

  9. 牛客多校第九场 B Quadratic equation 模平方根

    题意: 已知 $x+y$ $mod$ $q = b$ $x*y$ $mod$ $q = c$ 已知b和c,求x和y 题解: 容易想到$b^2-4c=x^2-2xy+y^2=(x-y)^2$ 那么开个根 ...

随机推荐

  1. java中的final关键字的用法

    一. 什么是final关键字? final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变 ...

  2. Android中的ListView的绘制过程中执行的方法

    首先,系统在绘制ListView之前, 将会先调用getCount方法来获取Item的个数.(如果getCount方法返回0的话,列表时不显示任何内容的) 之后每绘制一个 Item就会调用一次getV ...

  3. Shell基础(四):字符串截取及切割、字符串初值的处理、基使用Shell数组、expect预期交互、使用正则表达式

    一.字符串截取及切割 目标: 使用Shell完成各种Linux运维任务时,一旦涉及到判断.条件测试等相关操作时,往往需要对相关的命令输出进行过滤,提取出符合要求的字符串. 本案例要求熟悉字符串的常见处 ...

  4. QtConcurrent::run() 的使用

    QFuture<T>run(constClass *object,T(Class::*fn)(Param1,Param2,Param3,Param4,Param5)const,constA ...

  5. JDK的下载及安装

    JDK下载及安装 JDK的下载 官网下载 点击进入之后,显示的是当前版本最新的,点击downloads,选择适合自己电脑的版本下载 下载历史版本要一直往下拉,找到如图: 点击之后会显示以往的版本 环境 ...

  6. Dubbo入门到精通学习笔记(十七):FastDFS集群的安装、FastDFS集群的配置

    文章目录 FastDFS集群的安装 FastDFS 介绍(参考:http://www.oschina.net/p/fastdfs) FastDFS 上传文件交互过程: FastDFS 下载文件交互过程 ...

  7. dlib库检测人脸使用方法与简单的疲劳检测应用

    简介: dlib库是一个很经典的用于图像处理的开源库,shape_predictor_68_face_landmarks.dat是一个用于人脸68个关键点检测的dat模型库,使用这个模型库可以很方便地 ...

  8. python 实现异常退出

    https://blog.csdn.net/u013385362/article/details/81206822 有时当一个条件成立的情况下,需要终止程序,可以使用sys.exit()退出程序.sy ...

  9. VC++ 2010 创建高级Ribbon界面详解(1)

    运用 VC++ 2010 创建高级 Ribbon 界面详解,包括 Ribbon 界面的结构层次.Ribbon 控件的使用等,ribbon 用户界面,ribbon interface ,ribbon 高 ...

  10. [已解决]Series object has no attribute explode

    报错代码 s = pd.Series([[1, 2, 3], 'foo', [], [3, 4]]) s 0 [1, 2, 3] 1 foo 2 [] 3 [3, 4] dtype: object s ...