给定一个非负整数 阶乘的和(冬季每日一题 7)_数据,请你判断是否存在一些整数 阶乘的和(冬季每日一题 7)_#include_02,能够使得 阶乘的和(冬季每日一题 7)_#include_03,其中 阶乘的和(冬季每日一题 7)_数据_04

阶乘的和(冬季每日一题 7)_#include_05

输入格式
输入包含多组测试数据。

每组数据占一行,包含一个非负整数 阶乘的和(冬季每日一题 7)_数据

最后一行是一个负数,表示输入结束,无需处理。

输出格式
每组数据输出一行结果,如果 阶乘的和(冬季每日一题 7)_数据 能表示为若干数的阶乘之和,则输出 ​​​YES​​​,否则输出 ​​NO​​。

数据范围
阶乘的和(冬季每日一题 7)_数据_08
每组输入最多包含 100 组数据。

输入样例:

9
-1

输出样例:

YES

#include<iostream>
#include<unordered_set>

using namespace std;

const int N = 15;

int n;
int a[N];
unordered_set<int> S;

int main(){

a[0] = 1;
for(int i = 1; i < 10; i++) a[i] = a[i-1]*i;

for(int i = 1; i < (1 << 10); i++){

int res = 0;
for(int j = 0; j < 10; j++)
if(i >> j & 1)
res += a[j];

S.insert(res);
}

while(cin >> n, n >= 0)
if(S.count(n)) puts("YES");
else puts("NO");

}