比赛 NOIP水题争霸赛 评测结果 AAAAAAAAAA
题目名称 博士的密码 最终得分 100
用户昵称 偽りの神に抗え 运行时间 0.116 s
代码语言 C++ 内存使用 16.24 MiB
提交时间 2018-02-11 21:10:59
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#define hashsize 1000003
using namespace std;
typedef long long LL;
int n,m;
LL key,a[50],sum[50],sumup[50],ans=0;
vector<LL>g[hashsize],c[hashsize];
int hash(int x)
{
    return abs(x%hashsize);
}
int hash_look(int x)
{
    int i=hash(x);
    for(int k=0;k<g[i].size();k++)
    if(g[i][k]==x)return c[i][k];
    return 0;
}
void hash_ins(int x)
{
    int i=hash(x);
    for(int k=0;k<g[i].size();k++)
    if(g[i][k]==x)
	{
	    c[i][k]++;
		return;
	}
    g[i].push_back(x);
    c[i].push_back(1);
}
void run1(int i,int now)
{
	if(i>m)
	{
		hash_ins(now);
		return;
	}
	run1(i+1,now+a[i]);
	run1(i+1,now);
}
void run2(int i,int now)
{
	if(i>n)
	{
		ans+=hash_look(key-now);
		return;
	}
	run2(i+1,now+a[i]);
	run2(i+1,now);
}
void solve100()
{
	run1(1,0);
	run2(m+1,0);
	cout<<ans;
}
int main()
{
	freopen("password1.in","r",stdin);
	freopen("password1.out","w",stdout);
	cin>>n>>key;
	m=n/2;
	sum[0]=0;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	sort(a+1,a+n+1);
	solve100();
	return 0;
}