Description
给出⼀个自然数,求这个数是否能够表示成⼏个不同的正整数的阶乘之和。
Format
Input
有多组数据。
第⼀⾏⼀个正整数 T,表示共有 T 组数据。
接下来 T ⾏,每⾏⼀个自然数 N。
Output
输出 T ⾏。
如果该数可以被表示为⼏个不同的正整数的阶乘之和,输出“TAK”(不含引号)。
否则,输出“NIE”(同样不含引号)。
Samples
输入数据 1
10
3
27
2
33
75
9
28
33
31
1
Copy
输出数据 1
TAK
TAK
TAK
TAK
NIE
TAK
NIE
TAK
TAK
TAK
Copy
输入数据 2
2
4
0
Copy
输出数据 2
NIE
NIE
Copy
Limitation
【数据规模与约定】
对于 20% 的数据,有 1 ≤ T ≤ 10,自然数最⼤不超过 100
对于 40% 的数据,有 1 ≤ T ≤ 100,自然数最⼤不超过 1000
对于 60% 的数据,有 1 ≤ T ≤ 1000,自然数最⼤不超过 1000000
对于 100% 的数据,有 1 ≤ T ≤ 100000,所有自然数在 long long 范围内
#include<bits/stdc++.h>
using namespace std;
long long f[1001],dd=1,t,n=0,m,g;
int main(){
ios::sync_with_stdio (false);
dd=1;
for(int i=1;dd<=1e18;i++){
dd*=i;
f[++n]=dd;
}
cin>>t;
for(int i=1;i<=t;i++){
cin>>m;
g=m;
for(int j=n;j>=1;j--){
if(g>=f[j]){
g-=f[j];
}
}
if(g==0&&m!=0){
cout<<"TAK\n";
}
else{
cout<<"NIE\n";
}
}
}