階乘之和
時間限制:3000 ms | 記憶體限制:65535 KB
難度:3
- 描述
-
給你一個非負數整數n,判斷n是不是一些數(這些數不允許重複使用,且為正數)的階乘之和,如9=1!+2!+3!,如果是,則輸出Yes,否則輸出No;
- 輸入
- 第一行有一個整數0<m<100,表示有m組測試資料;
每組測試資料有一個正整數n<1000000; - 輸出
- 如果符合條件,輸出Yes,否則輸出No;
- 樣例輸入
-
2 9 10
- 樣例輸出
-
Yes No
打表先把前9個元素的階乘算出來,然後從大到小貪心求解#include <iostream> #include <vector> #include <algorithm> #define MAX 10 using namespace std; long table[MAX]={0}; void make_table(){ table[1]=1; for(int i = 2; i < MAX; ++ i){ table[i] =i*table[i-1]; } } int main(){ make_table(); int m; cin >>m; for(int icase = 0 ; icase < m; ++ icase){ long n; cin >> n; for(int i = MAX-1; i> 0 && n ; -- i){ if(n >= table[i] ) n-=table[i]; } if(n) cout<<"No"<<endl; else cout<<"Yes"<<endl; } }