1082. Easy to AC

单点时限: 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40394960/article/details/105856590
ac