关于某种密码有如下描述:某种密码的原文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

  1. /*
  2. 这道题作为第一题难度确实是不大,但一定要有这个优化的意识,如果纯粹搜索所有方案,时间无法承受,我们可以考虑到,当前面一些的值计算出来,后面的值等于说是在前面的基础上进行进一步的计算,我们于是考虑到去掉“在前面的基础上”这个指数级的冗余运算,通过后面和前面比较,先算前面的,后面的看有没有那个和他相加等于K的就行了,hash运算,注意sum可能是一个很大的负数
  3. */
  4. //我写的hash
  5. #include<iostream>
  6. #include<cstdio>
  7. #include<string>
  8. #include<cstring>
  9. #include<algorithm>
  10. #include<map>
  11. #include<vector>
  12. #define ll long long
  13. #define fo(i,l,r) for(int i = l;i <= r;i++)
  14. using namespace std;
  15. const ll sed = ,Sed = ,mod = ,Mod = ;
  16. struct dat{
  17. ll v;
  18. ll a;
  19. };
  20. int n;
  21. bool gt;
  22. vector<dat> h[mod];
  23. ll a[],key,ans,lm;
  24. inline void dfs(int pos,ll sum){
  25. if(pos <= lm){
  26. dfs(pos+,sum+a[pos]);
  27. dfs(pos+,sum);
  28. }else{
  29. dat tmp;
  30. if(!gt) {
  31. ll ha = (sum + mod*) % mod;
  32. ll hb = (sum + Mod*) % Mod;
  33. for(int i = ;i < h[ha].size();i++){
  34. if(h[ha][i].v == hb){
  35. h[ha][i].a++;
  36. return;
  37. }
  38. }
  39. tmp.v = hb;
  40. tmp.a = ;
  41. h[ha].push_back(tmp);
  42. }else{
  43. ll ha = (key - sum + mod*) % mod;
  44. ll hb = (key - sum + Mod*) % Mod;
  45. for(int i = ;i < h[ha].size();i++){
  46. if(h[ha][i].v == hb){
  47. ans+=h[ha][i].a;
  48. break;
  49. }
  50. }
  51. }
  52.  
  53. }
  54. }
  55. int main(){
  56. freopen("password.in","r",stdin);
  57. freopen("password.out","w",stdout);
  58. cin>>n>>key;
  59. fo(i,,n){
  60. cin>>a[i];
  61. }
  62. if(n == ){
  63. ans = (a[] == key) + ( == key);
  64. return ;
  65. }
  66. lm = n >> ;
  67. dfs(,);
  68. gt = true;
  69. lm = n;
  70. dfs((n >> )+,);
  71. cout<<ans;
  72. return ;
  73. }
  74. //黄学长Map
  75. #include<iostream>
  76. #include<cstdio>
  77. #include<cstring>
  78. #include<cstdlib>
  79. #include<algorithm>
  80. #include<cmath>
  81. #include<map>
  82. #include<vector>
  83. #define ll long long
  84. using namespace std;
  85. inline int read()
  86. {
  87. int x=,f=;char ch=getchar();
  88. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  89. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  90. return x*f;
  91. }
  92. bool flag;
  93. ll ans;
  94. int n,cnt,key;
  95. int a[];
  96. map<int,int> b;
  97. void dfs(int x,int now)
  98. {
  99. if(x==cnt+)
  100. {
  101. if(!flag)b[now]++;
  102. else ans+=b[key-now];
  103. return;
  104. }
  105. dfs(x+,now+a[x]);
  106. dfs(x+,now);
  107. }
  108. int main()
  109. {
  110. //freopen("password.in","r",stdin);
  111. //freopen("password.out","w",stdout);
  112. n=read();key=read();
  113. for(int i=;i<=n;i++)
  114. a[i]=read();
  115. cnt=n/;dfs(,);
  116. flag=;cnt=n;dfs(n/+,);
  117. printf("%I64d",ans);
  118. return ;
  119. }

黄学长模拟day1 某种密码的更多相关文章

  1. 黄学长模拟day1 大逃亡

    给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上,矩形的行号从0到X-1,列号从 ...

  2. 黄学长模拟day1 球的序列

    N个编号为1-n的球,每个球都有唯一的编号.这些球被排成两种序列,分别为A.B序列,现在需要重新寻找一个球的序列l,对于这个子序列l中任意的两个球,要求j,k(j<k),都要求满足lj在A中位置 ...

  3. 某种密码(password.*)

    关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY.若KEY=∑▒[Ai*Bi],则密文就是原文的一组合法密码.现在有原文 ...

  4. Luogu U13059 某种密码

    应该没什么用的题目链接 题目背景 关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY.若KEY=∑▒[Ai*Bi],则密文 ...

  5. 省常中模拟 day1

    第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...

  6. Android 模拟登陆 保存密码(信息)到手机中 文件信息读取

    package com.wuyou.login; import java.io.IOException; import java.util.Map; import android.app.Activi ...

  7. 2017-9-3模拟赛T3 密码(key)

    题目 题解 这题用类似暴力+优化(划掉)的思想. 对于每个轨迹串,求出每一位向后的第一个0-9间某个数字的位置(如123112中3后面第1个2的位置为从左往右数第6个),复杂度O(Σn)=O(L). ...

  8. 黄聪:OTP动态密码_Java代码实现

    OTP认知 动态口令(OTP,One-Time Password)又称一次性密码,是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常 ...

  9. HGOI20180817 (NOIP模拟Day1 task)

    HGOI自测 初测:150=80+20+50 rank1~rank3(并列3个rank1,所以我是rank3 qwq) 今日分突然想简约 CF359A Table https://www.luogu. ...

随机推荐

  1. java 环境变量 设置 问题

    问题按照网上教程配置好了  tomcat可以用了.但是发现java不能用. 网上教程(类似教程太多了 ,就不 具体说了 http://jingyan.baidu.com/article/f96699b ...

  2. POJ 1804 Brainman(归并排序)

    传送门 Description Background Raymond Babbitt drives his brother Charlie mad. Recently Raymond counted ...

  3. jboss wildfly 外网访问

    在standalone.xml中: 找到下面三行,看到是要访问public(8080端口的)和management的interface,将interface中的127.0.0.1改为0.0.0.0即可 ...

  4. 收集的一些jQuery (我平常用的少的,但确实挺有效果的)

    禁用Jquery(动画)效果 jQuery.fx.off = true; 使用自己的 Bullets(这个有一丁点儿的小技巧) //这里是js代码 也就是给每个ul添加一个类名 然后给ul的子li前面 ...

  5. iOS - 装饰对象

    1.设计模式原则 多组合,少继承 类对拓展开放,对修改关闭 派生的子类接口是在编译时就静态决定的,而所有子类都会继承到相同的接口.然而,利用组合或者说装饰模式来拓展抽象类的接口,就可以在运行时动态的进 ...

  6. 一个叫<NameValuePair>的东西~~~

    public String getInviteRelation(String phone){ String url = PropertiesUtil.getPropertyValue("HH ...

  7. spring--基本介绍

    1.1.1  Spring是什么 Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发.应用程序是由 ...

  8. _mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h':问题的解决 mysql安装python

    在win7下安装了Python后,想安装python-MySQL,使用pip安装出现如下问题: >pip install MySQL-python _mysql.c(42) : fatal er ...

  9. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新 ...

  10. Vim编辑器

    vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...