单点时限: 2.0 sec
内存限制: 256 MB
parytchen 最近做了几个很烦的题目,一直没有 AC,所以决定转型做一道简单题目,调节一下心情, 正好遇见一道简单的题目,partychen 准备把它 AC 掉再说。
数学博大精深,当然组成数学的就是一些数字,这些数字也有很多的特点,比如有一些数字它是另外一些各不相同的非负数字的阶乘之和。比如:数字9,9=1!+2!+3!。所以为了研究一个数字是否有这个的特性,你需要判断一下这个数字是否是其他数字阶乘之和。看了这个题目后 partychen 没有办法了,你不忍心看他继续郁闷下去吧,所以希望你能帮他解决这个问题。
输入格式
你将得到一个 n(n≤1 000 000),每行一个数字,以负数作为输入结束。
输出格式
对于每一个 n,判断 n 是否等于 ∑xi(xi≥0),t 为 xi 的个数,t≥1, 如果成立则输出 YES,不成立则输出 NO。每行一个输出。
样例
input
9
-1
output
YES
/*
思路:dfs选与不选问题
*/
#include<iostream>
using namespace std;
long long f[11];
int flag=0;
int n;
void factor() {
f[0]=1;
long long sum=1;
int i;
for(i=1; i<11; i++) {
sum*=i;
f[i]=sum;
}
}
void dfs(int index,int sum) {
if(flag==1)
return;
if(sum>n)
return;
if(sum==n) {
flag=1;
return;
}
if(index>=10)
return;
dfs(index+1,sum+f[index]);
dfs(index+1,sum);
}
int main() {
factor();
while(cin>>n&&n>=0) {
flag=0;
dfs(0,0);
if(flag&&n)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
// while(cin>>n) {
// if(n<0) break;
// else {
// if(n==0) cout<<"NO"<<endl;
// else if(n==1) cout<<"YES"<<endl;
// else if(n==2) cout<<"YES"<<endl;
// else {
// int i,j,k=n;
// for(i=9; i>=0; i--) {
// if(f[i]<=k) k-=f[i];
// }
// if(k==0) cout<<"YES"<<endl;
// else cout<<"NO"<<endl;
// }
// }
// }
return 0;
}