记录编号 |
487802 |
评测结果 |
AAAAAAAAAA |
题目名称 |
博士的密码 |
最终得分 |
100 |
用户昵称 |
Kyru Yann |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.150 s |
提交时间 |
2018-02-12 11:33:53 |
内存使用 |
10.59 MiB |
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <cctype>
#include <iomanip>
#define inf 0x7f7f7f7f
#define hashsize 1000007
using namespace std;
struct data
{
long long val;
int cnt;
};
vector<data>hash[hashsize];
long long k,a[505],sum=0,ans=0;
int n,first,last;
int find_hash(long long x)
{
return ((x+hashsize)%hashsize+hashsize)%hashsize;
}
void add(long long x)
{
int i=find_hash(x);
for(int j=0;(unsigned long long)j<hash[i].size();j++)
{
if(hash[i][j].val==x)
{
hash[i][j].cnt++;
return;
}
}
hash[i].push_back((data){x,1});
return;
}
int find(long long x)
{
int i=find_hash(x);
for(int j=0;(unsigned long long)j<hash[i].size();j++)
if(hash[i][j].val==x)
return hash[i][j].cnt;
return 0;
}
void dfs(int i,bool stat)//stat==0:前半 stat==1:后半
{
if(i==last+1 && stat==false)
{
add(sum);
return;
}
if(i==n+1 && stat==true)
{
ans+=find(k-sum);
return;
}
sum+=a[i];
dfs(i+1,stat);
sum-=a[i];
dfs(i+1,stat);
}
int main()
{
freopen("password1.in","r+",stdin);
freopen("password1.out","w+",stdout);
cin>>n>>k; first=1;
for(int i=1;i<=n;i++) cin>>a[i];
last=n/2;
dfs(1,false); sum=0;
dfs(last+1,true);
cout<<ans;
return 0;
}