• [SDOI2016]排列计数


    [SDOI2016]排列计数

    题目大意:

    长度为(n(nle10^6))(1sim n)的排列(A),求恰好有(m)个数满足(A_i=i)的方案数。

    思路:

    二项式系数+全错位排列简单推一下即可。

    源代码:

    #include<cstdio>
    #include<cctype>
    typedef long long int64;
    inline int getint() {
    	register char ch;
    	while(!isdigit(ch=getchar()));
    	register int x=ch^'0';
    	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    	return x;
    }
    const int N=1e6+1,mod=1e9+7;
    int fac[N],ifac[N],d[N];
    void exgcd(const int &a,const int &b,int &x,int &y) {
    	if(!b) {
    		x=1,y=0;
    		return;
    	}
    	exgcd(b,a%b,y,x);
    	y-=a/b*x;
    }
    inline int inv(const int &x) {
    	int ret,tmp;
    	exgcd(x,mod,ret,tmp);
    	return (ret%mod+mod)%mod;
    }
    inline int C(const int &n,const int &m) {
    	return (int64)fac[n]*ifac[m]%mod*ifac[n-m]%mod;
    }
    int main() {
    	for(register int i=fac[0]=d[0]=1;i<N;i++) {
    		fac[i]=(int64)fac[i-1]*i%mod;
    	}
    	ifac[N-1]=inv(fac[N-1]);
    	for(register int i=N-1;i;i--) {
    		ifac[i-1]=(int64)ifac[i]*i%mod;
    	}
    	for(register int i=2;i<N;i++) {
    		d[i]=((d[i-1]+ifac[i]*(i&1?-1:1))%mod+mod)%mod;
    	}
    	for(register int i=2;i<N;i++) {
    		d[i]=(int64)d[i]*fac[i]%mod;
    	}
    	for(register int T=getint();T;T--) {
    		const int n=getint(),m=getint();
    		const int ans=(int64)C(n,m)*d[n-m]%mod;
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    TS的一些小东西
    关于Vue懒加载问题
    react子传父
    MYSQL存储过程以及结果集
    MYSQL视图 事务 游标 索引及其使用
    MYSQL数据库的修复方法MAC
    MYSQL用户授权以及SQL语句
    MySQL数据库基础知识
    JavaScript对象
    JavaScript控制语句
  • 原文地址:https://www.cnblogs.com/skylee03/p/9216641.html
Copyright © 2020-2023  润新知