題目大概意思是:讓判斷一個數n是否能夠用若干個數的階乘之和表示
例如9=1!+2!+3!
其中有一句我覺得有問題,導致我多提交一次 就是Σ1<=i<=txi!. (t >=1 1, xi >= 0, xi = xj if( i = j).就是說xi==xj的時候i==j 但是 0!==1!但是i!=j這可怎麼辦啊於是我就把0!擅自改成1 了結果錯了,後來又改成1 結果就對了,哎!深深體會到語言表達的重要性啊
一開始我是怎麼想的呢,n不超過1000000 最大也就10! 開一個長度爲10 的數組然後搜索,可惜超時,後來看別人的,我才忽然想到階乘是由它自己的性質的
一個數 a>b 且
for(i=0;i<=b;i++)
sum+=i!;
那麼重點來了哦, a>=sum; 當 a=2; b=1;時等號成立
所以本題直接利用這個性質,將用n減去小於n 的書的階乘,一直往下減,看是否能夠減到0 如果可以答案就是yes否則嘿嘿……
代碼:
#include <iostream>
#include <cstring>
using namespace std;
int map[11];
int n;
void init()
{
int s=1;
int i;
map[0]=1;
map[1]=1;
for(i=2;i<=10;i++)
{
s*=i;
map[i]=s;
}
}
int solve()
{
int i;
for(i=10;i>=0;i--)
if(n-map[i]==0)
return 1;
else if(n-map[i]>0)
n-=map[i];
return 0;
}
int main()
{
init();
while(scanf("%d",&n)!=EOF)
{
if(n<0)//////此處注意切不可寫 if(n==-1) break; 否則會出錯的,測試數據中可能會包含非-1 其他的負數
break;
if(solve()==0)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}