RT,我的代码不开 O2 就全部 RE,开了就过了
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define eps 1e-8
const int inf=0x3f3f3f3f;
const int Maxn=1e7+10;
const int Mod=1e9+7;
int fac[Maxn];
int dfac[Maxn];
int qpow(int a,int b=Mod-2)
{
int res=1;
while(b)
{
if(b&1)
{
res=res*a%Mod;
}
a=a*a%Mod;
b>>=1;
}
return res;
}
int D[Maxn];
int C(int x,int y)
{
return fac[x]%Mod*dfac[y]%Mod*dfac[x-y]%Mod;
}
signed main()
{
fac[0]=1;
dfac[0]=qpow(1);
for(int i=1;i<=1000000;i++)
{
fac[i]=fac[i-1]*i%Mod;
dfac[i]=qpow(fac[i]);
}
D[1]=0;
D[2]=1;
D[3]=2;
for(int i=4;i<=1000000;i++)
{
D[i]=(i-1)%Mod*(D[i-1]%Mod+D[i-2]%Mod)%Mod;
// cout<<D[i]<<" ";
}
int q;
scanf("%lld",&q);
while(q--)
{
int n,m;
scanf("%lld%d",&n,&m);
if(n<=m)
{
puts("0");
continue;
}
if(m==n)
{
puts("1");
}else if(m==0){
printf("%lld\n",D[n]);
}else{
int ans=C(n,m)*D[n-m]%Mod;
printf("%lld\n",ans);
}
}
return 0;
}