记录编号 488372 评测结果 AAAAAAAAAA
题目名称 博士的密码 最终得分 100
用户昵称 GravatarHtBest 是否通过 通过
代码语言 C++ 运行时间 0.119 s
提交时间 2018-02-21 08:43:03 内存使用 24.31 MiB
显示代码纯文本
#define _CRT_SECURE_NO_DEPRECATE
/************************
 *创建时间:2018 02 20
 *文件类型:源代码文件
 *题目来源:2018寒假·NOI导刊
 *采用算法:分治、搜索
 *作者:HtBest
 ************************/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <string.h>
// #include <stack>
// #include <queue>
#include <map>
// #include <set>
// #include <vector>
// #include <ctype.h>
// #include <math.h>
// #include <bits/stdc++.h>
using namespace std;
int n,key,a[50],flag,_dic[3]={0};
long long dic[3][1<<20],counts=0;
map <long long, int> ans[3];
/*------------------------------声明变量------------------------------*/
/* Variable explain:
 
 */
void dfs(int head,int tail,int value)
{
    if(head==tail)
    {
        if(ans[flag][value]==0)
            dic[flag][_dic[flag]++]=value;
        ans[flag][value]++;
        return;
    }
    dfs(head+1,tail,value);
    dfs(head+1,tail,value+a[head]);
    return;
}
int main()
{
    freopen("password1.in","r",stdin);
    freopen("password1.out","w",stdout);
    scanf("%d%d",&n,&key);
    for(int i=0;i<n;++i)    scanf("%d",&a[i]);
    flag=0;    dfs(0,n>>1,0);
    flag=1;    dfs(n>>1,n,0);
    for(int i=0;i<_dic[0];++i)
    {
        for(int j=0;j<_dic[1];++j)
        {
            int ls1=dic[0][i],ls2=dic[1][j];
            if (ls1+ls2==key)
            {
                // printf("Found:%d + %d = %d ,add %d * %d\n",ls1,ls2,key,ans[0][ls1],ans[1][ls2]);
                counts+=ans[0][ls1]*ans[1][ls2];
            }
        }
    }
    printf("%lld",counts);
    return 0;
}