搜索思维题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Max=3000;
const ll M=1e9+7;
ll ANS[Max+10],JC[Max+10],INV[Max+10];
void F(int x,int mul,int sum,int num,ll inv){
if(x==1){
int xx=mul-sum;
if(xx>=0&&num+xx<=Max){
ANS[num+xx]=(ANS[num+xx]+JC[num+xx]*inv%M*INV[xx]%M)%M;
}
return;
}
F(x-1,mul,sum,num,inv);
for(int i=1;mul*x<=Max*2;++i){
mul=mul*x;
F(x-1,mul,sum+x*i,num+i,INV[i]*inv%M);
}
return;
}
ll Pow(ll x,ll y){
ll ans=1;
for(;y;y/=2,x=x*x%M)if(y%2==1)ans=ans*x%M;
return ans;
}
int main(){
JC[0]=1;
for(ll i=1;i<=Max;++i)JC[i]=JC[i-1]*i%M;
for(ll i=0;i<=Max;++i)INV[i]=Pow(JC[i],M-2);
F(Max,1,0,0,1);
int T;cin>>T;while(T--){
int x;
cin>>x;
cout<<ANS[x]<<endl;
}
}