黄学长模拟day1 某种密码
关于某种密码有如下描述:某种密码的原文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
/*
这道题作为第一题难度确实是不大,但一定要有这个优化的意识,如果纯粹搜索所有方案,时间无法承受,我们可以考虑到,当前面一些的值计算出来,后面的值等于说是在前面的基础上进行进一步的计算,我们于是考虑到去掉“在前面的基础上”这个指数级的冗余运算,通过后面和前面比较,先算前面的,后面的看有没有那个和他相加等于K的就行了,hash运算,注意sum可能是一个很大的负数
*/
//我写的hash
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#define ll long long
#define fo(i,l,r) for(int i = l;i <= r;i++)
using namespace std;
const ll sed = ,Sed = ,mod = ,Mod = ;
struct dat{
ll v;
ll a;
};
int n;
bool gt;
vector<dat> h[mod];
ll a[],key,ans,lm;
inline void dfs(int pos,ll sum){
if(pos <= lm){
dfs(pos+,sum+a[pos]);
dfs(pos+,sum);
}else{
dat tmp;
if(!gt) {
ll ha = (sum + mod*) % mod;
ll hb = (sum + Mod*) % Mod;
for(int i = ;i < h[ha].size();i++){
if(h[ha][i].v == hb){
h[ha][i].a++;
return;
}
}
tmp.v = hb;
tmp.a = ;
h[ha].push_back(tmp);
}else{
ll ha = (key - sum + mod*) % mod;
ll hb = (key - sum + Mod*) % Mod;
for(int i = ;i < h[ha].size();i++){
if(h[ha][i].v == hb){
ans+=h[ha][i].a;
break;
}
}
} }
}
int main(){
freopen("password.in","r",stdin);
freopen("password.out","w",stdout);
cin>>n>>key;
fo(i,,n){
cin>>a[i];
}
if(n == ){
ans = (a[] == key) + ( == key);
return ;
}
lm = n >> ;
dfs(,);
gt = true;
lm = n;
dfs((n >> )+,);
cout<<ans;
return ;
}
//黄学长Map
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
bool flag;
ll ans;
int n,cnt,key;
int a[];
map<int,int> b;
void dfs(int x,int now)
{
if(x==cnt+)
{
if(!flag)b[now]++;
else ans+=b[key-now];
return;
}
dfs(x+,now+a[x]);
dfs(x+,now);
}
int main()
{
//freopen("password.in","r",stdin);
//freopen("password.out","w",stdout);
n=read();key=read();
for(int i=;i<=n;i++)
a[i]=read();
cnt=n/;dfs(,);
flag=;cnt=n;dfs(n/+,);
printf("%I64d",ans);
return ;
}
黄学长模拟day1 某种密码的更多相关文章
- 黄学长模拟day1 大逃亡
给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上,矩形的行号从0到X-1,列号从 ...
- 黄学长模拟day1 球的序列
N个编号为1-n的球,每个球都有唯一的编号.这些球被排成两种序列,分别为A.B序列,现在需要重新寻找一个球的序列l,对于这个子序列l中任意的两个球,要求j,k(j<k),都要求满足lj在A中位置 ...
- 某种密码(password.*)
关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY.若KEY=∑▒[Ai*Bi],则密文就是原文的一组合法密码.现在有原文 ...
- Luogu U13059 某种密码
应该没什么用的题目链接 题目背景 关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY.若KEY=∑▒[Ai*Bi],则密文 ...
- 省常中模拟 day1
第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...
- Android 模拟登陆 保存密码(信息)到手机中 文件信息读取
package com.wuyou.login; import java.io.IOException; import java.util.Map; import android.app.Activi ...
- 2017-9-3模拟赛T3 密码(key)
题目 题解 这题用类似暴力+优化(划掉)的思想. 对于每个轨迹串,求出每一位向后的第一个0-9间某个数字的位置(如123112中3后面第1个2的位置为从左往右数第6个),复杂度O(Σn)=O(L). ...
- 黄聪:OTP动态密码_Java代码实现
OTP认知 动态口令(OTP,One-Time Password)又称一次性密码,是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常 ...
- HGOI20180817 (NOIP模拟Day1 task)
HGOI自测 初测:150=80+20+50 rank1~rank3(并列3个rank1,所以我是rank3 qwq) 今日分突然想简约 CF359A Table https://www.luogu. ...
随机推荐
- 更改codeblocks的配色方案
codeblocks默认只有一种配色方案, 不过我们可以手动添加. 在终端下输入如下命令: cd ~/.codeblocks sudo gedit default.conf 在打开的配置文件中, 找到 ...
- Python Twisted、Reactor
catalogue . Twisted理论基础 . 异步编程模式与Reactor . Twisted网络编程 . reactor进程管理编程 . Twisted并发连接 1. Twisted理论基础 ...
- Java Attach API
catalog . instrucment与Attach API . BTrace: VM Attach的两种方式 . Sun JVM Attach API 1. instrucment与Attach ...
- JavaScript 写几个简单的知识点
首先,还是用比较官方的文字描述来解释下JavaScript: JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为 ...
- POJ1741:tree
传送门 时隔一个月再次写点分治,比上一次要深入理解很多了.(虽然代码还是写不熟 模板题,不多说 //POJ 1741 //by Cydiater //2016.9.22 #include <cs ...
- BIOS设置第一启动项
在电脑的Bois中怎样去设置第一启动项.. 对于很多新手朋友来说,BIOS满屏英文,生涩难懂,话说我原来也很排斥BIOS,界面太丑,光看界面就没什么兴趣,更谈不上深入研究,大多数人在电脑城装机的时候都 ...
- 删除ibus之后导致系统设置进不了
sudo apt-get instal ubuntu-desktop 快捷键调出sogou拼音,默认为"ctrl+,"
- Java数据库——使用元数据分析数据库
在JDBC中提供了DatabaseMetaData和ResultSetMetaData接口来分析数据库的元数据. DatabaseMetaData 使用DatabaseMetaData取得数据库的元信 ...
- 关于软件工程个人作业 Word frequency program 的总结
一.预计花在程序各部分的时间: (1)对所给命令行参数的判断和处理,看它是否合法.是哪种模式.预计用时20min; (2)关于目录操作:遍历给定目录下的所有文件,包括子目录和非目录文件.预计用时40m ...
- PHP内存溢出解决方案
一.内存溢出解决方案 在做数据统计分析时,经常会遇到大数组,可能会发生内存溢出,这里分享一下我的解决方案.还是用例子来说明这个问题,如下: 假定日志中存放的记录数为500000条,那么解决方案如下: ...