1)设i<=n-1,有i!<=(n-1)!,就有0~n-1的阶乘和sum(i!)<=n(n-1)!=n!
2)所以i从大到小,如果i!<n,i!必须用来表示n,因为如果放弃了当前的i!,后面小于i的阶乘的和 <=i! <n(上面公式得出),所以i!必须用来表示n~~
3)n给出范围为0~1000000,经计算,10!>1000000,所以只需判断i从0~9

PS:输入0时要输出NO!,0!=1

#include  < iostream >
#include 
< vector >
#include 
< string >
#include 
< math.h >
#include 
< iomanip >
#include 
< stdlib.h >
using   namespace  std;

long   long  store[ 10 ];
void  calculate()
{
    
int i,mul=1;
    
for(i=1;i<10;i++)
    
{
        mul
*=i;
        store[i]
=mul;
    }

    store[
0]=1;
}





bool  workout( int  n)
{
    
int i;
    
if(n==0)return false;
    
for(i=9;i>=0;i--)
    
{
        
if(store[i]<=n)
            n
-=store[i];
        
if(n==0)return true;
    }

    
return false;
}





int  main()
{
    
int n;
    calculate();
    
while(1)
    
{
        scanf(
"%d",&n);
        
if(n<0)break;
        
if(workout(n))printf("YES\n");
        
else printf("NO\n");
    }

    
return 0 ;
}