a,b杀n个人,每时每刻都必须是b>a
第一个人必定是b杀,所以问题就转化为图像从(1,0) 到(b杀,a杀)不碰y=x的方法数
满足方法数=所有方法数-不满足方法数
不满足方法数计算:从(0,1) 到(b杀,a杀)的方法数(如图只要把每次的路线按y=x对称就是一条(1,0)出发过线的方法)
不满足:
所有
所有-不满足=C(n-1,n/2)
求C(n-1,n/2)= (n-1)!/(n/2)!/(n-1-n/2)!
求阶乘先用线性筛 求出每一个数的逆
在通过逆元的积性
#include<bits/stdc++.h> using namespace std; const int N=1e6+10, mod=1e9+7; typedef long long ll; ll fact[N],invfact[N]; int t,n; ll C(int n,int m){ //cout<<fact[n]<<" "<<invfact[m]<<" "<<invfact[n-m]<<endl; return fact[n]*invfact[m]%mod*invfact[n-m]%mod; } void init(){ fact[0]=1; for(int i=1;i<=N-5;i++) fact[i]=fact[i-1]*i%mod; invfact[0]=invfact[1]=1; for(int i=2;i<=N-5;i++) invfact[i]=(mod-(mod/i))*invfact[mod%i]%mod;//每个数的逆 for(int i=2;i<=N-5;i++) invfact[i]=invfact[i]*invfact[i-1]%mod;//阶乘的逆 } int main(){ scanf("%d",&t); init(); for(int i=0;i<t;i++){ scanf("%d",&n); printf("%lld\n",C(n-1,n/2)); } return 0; }