<span style="font-size:18px;">//题目网址 http://acm.hdu.edu.cn/showproblem.php?pid=5673</span>
<span style="font-size:18px;">//以下参考过网上代码 http://m.blog.csdn.net/article/details?id=51227707</span>
<span style="font-size:18px;">#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int mod=1000000007,maxn=1000100;
long long inv[maxn],h[maxn],c[maxn];
void getinv()//求逆元
{
int i;
inv[1]=1;
for(i=2;i<maxn;i++)
{
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
}
int main()
{
int i,T,n,k;
long long ans;
getinv();
h[1]=h[0]=1;
for(i=2;i<maxn;i++)//求卡特兰数(公式:c(n+1)=c(n)*(4*n-2)/(n+1))
{
h[i]=h[i-1]*(4*i-2)%mod*inv[i+1]%mod;
}
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=c[0]=1;
for(i=1;i<=n;i++)
{
c[i]=c[i-1]*(n-i+1)%mod*inv[i]%mod;//求组合数(公式:c(n,i)=c(n,i-1)*(n-i+1)/i)
//(可根据c(n,m)=n!/((n-m)!*m!)自己推)
}
for(i=1;;i++)
{
k=n-(i<<1);
if(k<0)break;
ans=(ans+h[i]*c[k])%mod;
}
printf("%lld\n",ans);
}
return 0;
}
</span>