某种密码
2018-09-01 05:38:04来源:博客园 阅读 ()
时限1s 空间限制256M
题目描述
关于某种密码有如下描述:某种密码的原文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
一共两组可行的密文。
题解: 其实有点像双向搜索,因为2^40必定TLE,就不如这般搜索一下(味道更好
我们先处理前一半的加和的情况,在处理后一半加和的情况,如果两个加起来是key的话计算时一种情况了
保存加和情况的最好用hash表
(但是本宝宝实在是太弱了,就用map了
差不多就是这样的。。emm
#include <bits/stdc++.h> #include <map> using namespace std; typedef long long ll; inline ll read() { ll x = 0 , f = 1; char ch = getchar(); for ( ; !isdigit(ch) ; ch = getchar()) if (ch == '-') f = -1; for ( ; isdigit(ch) ; ch = getchar()) x = x * 10 + ch - '0'; return x * f; } const ll maxn = 50; ll a[maxn]; ll n , key; ll _left_geshu , _right_geshu , ans; map <ll , ll> M; int main() { n = read() , key = read(); for (ll i = 1 ; i <= n ; i ++) { a[i] = read(); } _left_geshu = (1 + n) >> 1 , _right_geshu = n - _left_geshu; for (ll i = 0 ; i < (1 << _left_geshu) ; i ++) { ll tmp = 0; for (ll j = 0 ; j < _left_geshu ; j ++) { if (i & (1 << j)) { tmp += a[j + 1]; } } M[tmp] ++; } for (ll i = 0 ; i < (1 << _right_geshu) ; i ++) { ll tmp = 0; for (ll j = 0 ; j < _right_geshu ; j ++) { if (i & (1 << j)) { tmp += a[_left_geshu + 1 + j]; } } if (M[key - tmp]) { ans += M[key - tmp]; } } printf("%lld\n" , ans); }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:华为机试 合并表记录
下一篇:华为机试 提取不重复的整数
- 洛谷 P1079 Vigenère 密码 2019-10-08
- 怎么偷上别人的微信 最简单偷微信密码不被发现_搜狐科技 2019-11-22
- 密码发生器 南阳acm519 2018-12-04
- 洛谷P1481 魔族密码(LIS) 2018-09-18
- CentOS 7 Root用户密码重置 2017-04-02 2018-06-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash