牛客多校第九场 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$ 那么开个根 ...
随机推荐
- Java刷题笔记
能用StringBuffer的时候坚决不要用String,因为前者的时间和空间效率都更高. 牛顿法求平方根:随便找一个K,然后不断让 k=(k+x/k)/2;直到K的平方与x之间的差距小于限定值. 斐 ...
- Windows注册表的学习
什么是注册表 注册表是Windows在Win95/98系统开始引入的一种核心数据库,里面存放着各类的配置信息.参数等.直接控制着系统的启动.硬件的装载以及Winodws程序的运行 手册表的功能 记录用 ...
- (转)JMS事务
转:http://blog.csdn.net/jixiuffff/article/details/5780834 事务 session = conn.createQueueSessio ...
- mongodb 查询指定字段
@AutowiredMongoDatabase database; @Overridepublic List<Grid> getAdditionalGrid(String collecti ...
- (9)centos7 安装与解压
1.zip/unzip zip 新file 旧file或文件夹 # 把旧文件和文件夹压缩成新文件 -r是文件夹下所有文件 zip -r a.zip ./doc #压缩当前目录 doc下的所有文件变成 ...
- 机器学习技法笔记:Homework #6 AdaBoost&Kernel Ridge Regression相关习题
原文地址:http://www.jianshu.com/p/9bf9e2add795 AdaBoost 问题描述 程序实现 # coding:utf-8 import math import nump ...
- PAT_A1101#Quick Sort
Source: PAT A1101 Quick Sort (25 分) Description: There is a classical process named partition in the ...
- MySql 主从复制及深入了解
分享一个不错的mysql文章 https://segmentfault.com/a/1190000008942618
- 68.最大k乘积问题 (15分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb题目内容:设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和 ...
- 天道神诀--IPSAN实现多链路以及多路径安装
# linux6 环境需求 ISCSI服务端: 2张网卡,足够的磁盘空间 iscsi客户端: 2张网卡(与服务端网段相同) ISCSI服务端配置: 与1张网卡配置主要差别在于配置文件中的允许访问网段, ...