#include<bits/stdc++.h>
#define int long long
//英特纳雄耐尔一定要实现
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
int T;
int cp[N],jc[N],n,m;
//cp 错排 jc 阶乘
inline void read(int &x){
x=0;int f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
x*=f;
}
#define cin(x) read(x)
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin(T);
cp[1]=0;
cp[2]=1;
cp[3]=2;
for(int i=4;i<N;i++){
cp[i]=(i-1)*(cp[i-1]+cp[i-2])%mod;
}
jc[0]=1;
for(int i=1;i<N;i++){
jc[i]=(jc[i-1]*i)%mod;
}
while(T--){
cin(n);
cin(m);
if(n-m==1) printf("0\n");
else if(m==n) printf("1\n");
else if(m==0) printf("%lld\n",cp[n]);
else{
int ans=jc[n]/jc[m]/jc[n-m];
ans=(ans*cp[n-m])%mod;
cout<<ans<<endl;
}
}
return 0;
}
(公式都是贺的)
rt,不知道为甚,除了特判全输出0,求神犇帮忙看看(