题目中所有的阶乘都只能用一次,注意0! = 1
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_set>
using namespace std;
unordered_set<int> S;
int f[10];
int main()
{
//0 ~ 9的阶乘预处理
for(int i = 0; i < 10; i ++ )
{
f[i] = 1;
for(int j = i; j; j -- )
{
f[i] *= j;
}
}
//用二进制中的1来表示当前的阶乘选还是不选,枚举所有情况 10个阶乘共有2^10种情况
//但由于题目中限制了t >= 1的,故至少选一个阶乘, i = 0即 什么都不选的情况不存在
for(int i = 1; i < 1 << 10; i ++ )
{
int s = 0;
for(int j = 0; j < 10; j ++ )
if(i >> j & 1)
s += f[j];
S.insert(s);
}
int n;
while(cin >> n, n >= 0)
{
if(S.count(n)) puts("YES");
else puts("NO");
}
return 0;
}