码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-03-31 21:34:33      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:子集   algorithm   ble   阶乘   一个   int   tar   bsp   while   

题目链接:
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 }

 

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

标签:子集   algorithm   ble   阶乘   一个   int   tar   bsp   while   

原文地址:https://www.cnblogs.com/fzl194/p/8684101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!