牛客多校第九场 D Knapsack Cryptosystem 背包
题意:
给你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 背包的更多相关文章
- 2019牛客多校第⑨场D Knapsack Cryptosystem(折半搜索)
原题:https://ac.nowcoder.com/acm/contest/889/D 题意: 给定大小为n(<=36)的集合a,整数s,求a的一个和为s的子集(有且只有一个) 思路: 直接搜 ...
- 牛客多校第九场 && 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 ...
- Cutting Bamboos(2019年牛客多校第九场H题+二分+主席树)
题目链接 传送门 题意 有\(n\)棵竹子,然后有\(q\)次操作,每次操作给你\(l,r,x,y\),表示对\([l,r]\)区间的竹子砍\(y\)次,每次砍伐的长度和相等(自己定砍伐的高度\(le ...
- 2018牛客多校第九场E(动态规划,思维,取模)
#include<bits/stdc++.h>using namespace std;const long long mod=1000000007,inv=570000004;long l ...
- 2019牛客多校第九场AThe power of Fibonacci——扩展BM
题意 求斐波那契数列m次方的前n项和,模数为 $1e9$. 分析 线性递推乘线性递推仍是线性递推,所以上BM. 由于模数非质数,上扩展版的BM. 递推多少项呢?本地输入发现最大为与前57项有关(而且好 ...
- 牛客多校第九场 J Symmetrical Painting 计算几何/扫描线
题意: 平面上有几个宽度相同的矩形区域被涂黑了,让你找到一条横线横截若干个矩形,把这些黑色部分抠下来一部分使得它们以这条横线为对称轴,求能抠下来的最大面积. 题解: 在随着对称轴上移的过程中,必然有一 ...
- 牛客多校第九场 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] ...
- 牛客多校第九场 E All men are brothers 并查集/组合论
题意: 一开始有n人互不认识,每回合有两个人认识,认识具有传递性,也就是相互认识的人组成小团体.现在问你每个回合,挑选四个人,这四个人互不认识,有多少种挑选方法. 题解: 认识不认识用并查集维护即可, ...
- 牛客多校第九场 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$ 那么开个根 ...
随机推荐
- php操作redis--列表篇
常用函数:lpush/rpush/lpop/rpop/lrange/lrem等 应用场景:关注列表,粉丝列表,发送缓冲队列等 特点:可理解为数组操作,插入和删除数据按照一定的规律排序,数据可重复 连接 ...
- 【原理】RabbitMQ架构图
Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输, Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列. Queue:消息 ...
- 区间dp(二维)——cf1199F
复杂度是O(N^5),枚举所有小矩形,转移时再按每列,每行进行转移 #include<bits/stdc++.h> using namespace std; #define N 55 in ...
- js设计模式——3.观察者模式
js设计模式——观察者模式 /*js设计模式——.观察者模式*/ // 主题,保存状态,状态变化之后触发所有观察者对象 class Subject { constructor() { this.sta ...
- firefox显示 您的连接不安全 解决办法
在地址栏键入"about:config" 点击“我了解此风险” 在下方任意位置右键,选择新建布尔值 输入首选项名称为“security.enterprise_roots.enabl ...
- 微信小程序 在使用wx.request时显示加载中
微信小程序中,向后台请求数据是,通常想给用户提示正在加载中,如下图: 我们可以用wx.showLoading(OBJECT),当请求服务器的地方多了,怎么才能不每次都要去调用函数,我们只要对wx.re ...
- java Logger 类
package org.rx.common; import org.slf4j.LoggerFactory; import java.util.Collections; import java.uti ...
- 戏说 .NET GDI+系列学习教程(三、Graphics类的应用_验证码扩展)
从别人那拷贝的 #region 定义和初始化配置字段 //用户存取验证码字符串 public string validationCode = String.Empty; //生成的验证码字符串 pub ...
- 2.2 webpack
webpack 介绍 webpack 是什么 为什么引入新的打包工具 webpack 核心思想 webpack 安装 webpack 使用 命令行调用 配置文件 webpack 配置参数 entry ...
- 拾遗:Go 代码结构
#define @ $ 概述 Go 编码通常将所有代码放置在同一个工作区 一个工作区包含多个版本仓库,使用 Git 等工具控制 每个仓库包含一个或多个包 每个包由同一目录中的一份或多份源代码组成 包的 ...