P4071 [SDOI2016]排列计数
错位排列板子题,plus: 组合数取模
const int N=1e6; #define int long long const int mod =1e9+7 ; int n,m,D[N+3] ; #define ll long long ll inv[N+3]; int F[N+3] ; int fpow(int n, int p, int mod){ n %= mod; int ans = 1, base = n; while(p){ if(p & 1) ans = ans * base % mod; base = base * base % mod; p >>= 1; } return ans; } void get_inv(ll n,ll p){ inv[N] = fpow(F[N], mod - 2, mod); for(int i = N - 1; i >= 0; --i) inv[i] = inv[i + 1] * (i + 1) % mod; } ll C(ll n,ll m){ return F[n]*inv[m]%mod*inv[n-m]%mod; } void sov(){ cout << (C(n,m)*D[n-m])%mod <<endl; } signed main() { F[0]=1; for(int i=1;i<=1e6;i++) F[i]=F[i-1]*i,F[i]%=mod; get_inv(1e6,mod); D[0]=0,D[1]=0,D[2]=1; for(int i=3;i<=1e6;i++) D[i] =(i-1)*(D[i-1]+D[i-2]),D[i]%=mod; int tes; cin>>tes; while(tes--){ cin>>n>>m; if(n==m) cout<<1<<endl; else sov() ; } }