给定一个非负整数 n,请你判断是否存在一些整数 xi,能够使得 n=∑1≤i≤txi!,其中 t≥1,xi≥0,xi=xj iff i=j。
iff 表示当且仅当。
输入格式
输入包含多组测试数据。
每组数据占一行,包含一个非负整数 n。
最后一行是一个负数,表示输入结束,无需处理。
输出格式
每组数据输出一行结果,如果 n 能表示为若干数的阶乘之和,则输出 YES,否则输出 NO。
数据范围
0≤n≤106,
每组输入最多包含 100 组数据。
输入样例:
9
-1
输出样例:
YES
此题需要注意0的阶乘是0
#include<bits/stdc++.h>
using namespace std;
//保存阶乘
int s[100];
bool dfs(int pos, int res) {
if (res == 0) return true;
for (int i = pos; i >= 0; i--) {
if (s[i] > res) continue;
int tmp = res - s[i];
if (dfs(i - 1, tmp)) return true;
}
return false;
}
int main() {
int n;
int aa = 1;
int i = 1;
s[0] = 1;
for (; aa < 1e6; i++) {
aa = aa*i;
s[i] = aa;
}
while (cin >> n) {
if (n < 0) return 0;
if (n != 0 && dfs(i - 1, n)) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}