记录编号 488372 评测结果 AAAAAAAAAA
题目名称 博士的密码 最终得分 100
用户昵称 GravatarHtBest 是否通过 通过
代码语言 C++ 运行时间 0.119 s
提交时间 2018-02-21 08:43:03 内存使用 24.31 MiB
显示代码纯文本
  1. #define _CRT_SECURE_NO_DEPRECATE
  2. /************************
  3. *创建时间:2018 02 20
  4. *文件类型:源代码文件
  5. *题目来源:2018寒假·NOI导刊
  6. *采用算法:分治、搜索
  7. *作者:HtBest
  8. ************************/
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <iostream>
  12. #include <algorithm>
  13. #include <string.h>
  14. // #include <stack>
  15. // #include <queue>
  16. #include <map>
  17. // #include <set>
  18. // #include <vector>
  19. // #include <ctype.h>
  20. // #include <math.h>
  21. // #include <bits/stdc++.h>
  22. using namespace std;
  23. int n,key,a[50],flag,_dic[3]={0};
  24. long long dic[3][1<<20],counts=0;
  25. map <long long, int> ans[3];
  26. /*------------------------------声明变量------------------------------*/
  27. /* Variable explain:
  28. */
  29. void dfs(int head,int tail,int value)
  30. {
  31. if(head==tail)
  32. {
  33. if(ans[flag][value]==0)
  34. dic[flag][_dic[flag]++]=value;
  35. ans[flag][value]++;
  36. return;
  37. }
  38. dfs(head+1,tail,value);
  39. dfs(head+1,tail,value+a[head]);
  40. return;
  41. }
  42. int main()
  43. {
  44. freopen("password1.in","r",stdin);
  45. freopen("password1.out","w",stdout);
  46. scanf("%d%d",&n,&key);
  47. for(int i=0;i<n;++i) scanf("%d",&a[i]);
  48. flag=0; dfs(0,n>>1,0);
  49. flag=1; dfs(n>>1,n,0);
  50. for(int i=0;i<_dic[0];++i)
  51. {
  52. for(int j=0;j<_dic[1];++j)
  53. {
  54. int ls1=dic[0][i],ls2=dic[1][j];
  55. if (ls1+ls2==key)
  56. {
  57. // printf("Found:%d + %d = %d ,add %d * %d\n",ls1,ls2,key,ans[0][ls1],ans[1][ls2]);
  58. counts+=ans[0][ls1]*ans[1][ls2];
  59. }
  60. }
  61. }
  62. printf("%lld",counts);
  63. return 0;
  64. }