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

Posted 努力努力再努力x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了南阳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 }

 

以上是关于南阳OJ-91-阶乘之和---二进制枚举(入门)的主要内容,如果未能解决你的问题,请参考以下文章

南阳oj 阶乘因式分解

计算阶乘之和

解题报告Acwing每日一题 夏季 [1/16]

⭐算法入门⭐《二分枚举》简单05 —— LeetCode 1. 两数之和

vb 求阶乘之和

1到10阶乘的和是多少