zoukankan      html  css  js  c++  java
  • 【组合数学】P4071 [SDOI2016]排列计数

    传送门:https://www.luogu.com.cn/problem/P4071

    分析

    就是从 (n) 个数中挑 (n-m) 个数,然后求 (n-m) 的错排个数即可。

    (D_n) 表示 (n) 个数错排的个数,有

    错排的通式:(D_n = n!(1 - frac{1}{1!} + frac{1}{2!} - frac{1}{3!} ... + (-1)^n frac{1}{n!}))
    错排递推式:(D_n = (n-1)(D_{n-1} + D_{n-2}))

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    #define endl '
    '
    
    const int N=1e6+5, mod=1e9+7;
    
    
    inline void read(ll &x) {
        int s=0;x=1;
        char ch=getchar();
        while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
        x*=s;
    }
    
    ll d[N];
    
    ll fpow(ll x,ll p)
    {
        ll res=1;
        for(;p;p>>=1,x=x*x%mod)
            if(p&1)res=res*x%mod;
        return res%mod;
    }
    
    ll inv(ll x){
    	return fpow(x,mod-2)%mod;
    }
    
    ll fac[N];
    
    ll C(ll a, ll b){
    	return fac[a]*inv(fac[b])%mod*inv(fac[a-b])%mod;
    }
    
    void init(){
    	d[1]=0, d[0]=d[2]=1;
    	for(int i=3; i<N; i++) d[i]=(i-1)*(d[i-1]+d[i-2])%mod;
    	
    	fac[0]=1;
    	for(int i=1; i<N; i++) fac[i]=fac[i-1]*i%mod;
    }
    
    
    int main(){
    	init();
    	int T; cin>>T;
    	while(T--){
    		ll n, m; read(n), read(m);
    		cout<<C(n, m)*d[n-m]%mod<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    移动端-纯css隐藏滚动条解决方案
    阻止点击穿透
    JS的防抖与节流
    go 自动安装项目依赖包
    git 修改远程仓库
    git 基础命令
    go 包govalidator
    go email
    windows下Redis的安装和使用
    go xorm,负载均衡
  • 原文地址:https://www.cnblogs.com/Tenshi/p/14813965.html
Copyright © 2011-2022 走看看