poj 1775 Sum of Factorials

題目大概意思是:讓判斷一個數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!擅自改成了結果錯了,後來又改成結果就對了,哎!深深體會到語言表達的重要性啊

一開始我是怎麼想的呢,n不超過1000000 最大也就10! 開一個長度爲10 的數組然後搜索,可惜超時,後來看別人的,我才忽然想到階乘是由它自己的性質的

一個數 a>b 

for(i=0;i<=b;i++)

sum+=i!;

那麼重點來了哦, a>=sum; 當 a=2; b=1;時等號成立

所以本題直接利用這個性質,將用n減去小於的書的階乘,一直往下減,看是否能夠減到如果可以答案就是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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章