错排问题
最开始以为是组合数取余结果样例兜不上去,才发现是错排问题
#include<bits/stdc++.h>
using namespace std;
#define ll long long
long long mod = 1e9+7;
ll up[1000010],d[1000010];
ll Pow(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()
{
//if(m==0) return 1;
//if(m>n-m) m=n-m;
//ll up=1,down=1;
up[0]=1;
for(ll i=1;i<=1e6;i++){
up[i]=(up[i-1]*i)%mod;
//down=(down*i)%p;
}
d[2]=1,d[3]=2;
for(ll i=4;i<=1e6;i++)
{
d[i]=(i-1)*(d[i-1]+d[i-2])%mod;
}
// cout<<up<<" "<<down<<" ";
//return up*Pow(up,p-2)%p;
}
ll c(ll n,ll m)
{
if( m==0 ) return 1;
// cout<<up[n]<<up[m]<<up[n-m]<<endl;
ll bb=up[n]*Pow(up[m]*up[n-m]%mod,mod-2)%mod;
return bb;
}
signed main()
{
int t;
cin>>t;
C();
while(t--)
{
ll n,m;
cin>>n>>m;
if(n==m)cout<<"1"<<endl;
else cout<<c(n,m)*d[n-m]%mod<<endl;
}
}