南阳OJ-91-阶乘之和---二进制枚举(入门)

题目链接:
http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=91

题目大意:

给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;n<1000000;

思路:

数据量小,直接预处理出所有满足的数,然后直接判断就行了,预处理时用了二进制枚举子集的方式来处理

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<set>
 6 #include<cmath>
 7 using namespace std;
 8 const int maxn = 1e4 + 10;
 9 int T, n;
10 int a[20];
11 set<int>s;
12 void judge(int x)
13 {
14     int tot = 0;
15     for(int i = 0; i < 9; i++)
16     {
17         if(x&(1<<i))tot += a[i + 1];
18     }
19     s.insert(tot);
20 }
21 int main()
22 {
23     cin >> T;
24     a[1] = 1;
25     for(int i = 2; i <= 9; i++)a[i] = a[i - 1] * i;
26     for(int i = 1; i < (1<<9); i++)
27     {
28         judge(i);
29     }
30     while(T--)
31     {
32         cin >> n;
33         if(s.count(n))cout<<"Yes"<<endl;
34         else cout<<"No"<<endl;
35     }
36     return 0;
37 }

 

posted @ 2018-03-31 20:46  _努力努力再努力x  阅读(309)  评论(0编辑  收藏  举报