比赛 NOIP水题争霸赛 评测结果 AAAAAAAAAA
题目名称 博士的密码 最终得分 100
用户昵称 Kyru Yann 运行时间 0.153 s
代码语言 C++ 内存使用 10.59 MiB
提交时间 2018-02-11 21:34:39
显示代码纯文本
#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;
}