ACM 階乘之和

OpenSoucre發表於2014-04-09

階乘之和

時間限制: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;

    }
}

  

 

相關文章