#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 1000010
ll t,n,m,d[N],jc[N];
ll mod=1e9+7;
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=(ans*a)%mod;
a=(a*a)%mod;
b >>=1;
}
return ans;
}
ll c(ll n,ll m)
{
return (jc[n]%mod*qpow(jc[n-m]*jc[m]%mod,mod-2)%mod)%mod;//x
}
ll lucas(ll n,ll m)
{
if(!m) return 1;//x
return (lucas(n/mod,m/mod)*c(n%mod,m%mod))%mod;
}
int main()
{
cin>>t;
d[1]=0;
d[2]=1;
jc[1]=1;
jc[2]=2;
for(ll i=3;i<=N-10;i++)
{
d[i]=((i-1)*(d[i-1]+d[i-2])%mod)%mod;
jc[i]=(jc[i-1]*i)%mod;
}
while(t--)
{
cin>>n>>m;
if(n==m) puts("1");
else if(n-m==1) printf("0\n");
else if(m==0) printf("%lld\n",d[n]);
else
{
//x
ll ans=(lucas(n,m)*d[n-m]%mod)%mod;
printf("%lld\n",ans);
}
}
return 0;
}
这是改过之后的代码,原本我的思路是错的,while循环里面的特判是这样写的
if(n==0) cout<<0<<endl;
else if(n-m==0) cout<<1<<endl;
else if(m==0) cout<<d[n]<<endl;
后来发现思路是错的但是特判改成正确的思路之后一直报wa,后来发现是输出的问题。
但是最离谱的是改过之前的代码,特判是错的,竟然AC了,有谁能告诉我为啥?