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

时间:2023-03-09 04:07:08
南阳OJ-91-阶乘之和---二进制枚举(入门)

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

题目大意:

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

思路:

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

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
const int maxn = 1e4 + ;
int T, n;
int a[];
set<int>s;
void judge(int x)
{
int tot = ;
for(int i = ; i < ; i++)
{
if(x&(<<i))tot += a[i + ];
}
s.insert(tot);
}
int main()
{
cin >> T;
a[] = ;
for(int i = ; i <= ; i++)a[i] = a[i - ] * i;
for(int i = ; i < (<<); i++)
{
judge(i);
}
while(T--)
{
cin >> n;
if(s.count(n))cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return ;
}