zoukankan      html  css  js  c++  java
  • [SDOI2016]排列计数

    题目描述

    求有多少种长度为 n 的序列 A,满足以下条件:

    1 ~ n 这 n 个数在序列中各出现了一次

    若第 i 个数 A[i] 的值为 i,则称 i 是稳定的。序列恰好有 m 个数是稳定的

    满足条件的序列可能很多,序列数对(10^9+7)取模。

    输入格式

    第一行一个数 T,表示有 T 组数据。

    接下来 T 行,每行两个整数 n、m。

    输出格式

    输出 T 行,每行一个数,表示求出的序列数

    测试点 1 ~ 3: T = 1000,n≤8,m≤8;

    测试点 4 ~ 6: T = 1000,n≤12,m≤12;

    测试点 7 ~ 9: T = 1000,n≤100,m≤100;

    测试点 10 ~ 12: T = 1000,n≤1000,m≤1000;

    测试点 13 ~ 14: T = 500000,n≤1000,m≤1000;

    测试点 15 ~ 20: T = 500000,n≤1000000,m≤1000000。


    在n个数中选m个,使得m个数中({forall}a[i]=i)的方案数可以表示为(C_{n}^{m})。而剩下的n-m个数必须满足({forall}a[i]{ eq}i),那么这个方案数可以表示为(D_{n-m}),即错排数。那么答案就是:

    [C_{n}^{m}*D_{n-m}={frac{n!}{m!(n-m)!}}*D_{n-m} ]

    其中的错排数可以通过递推公式计算:(D_i=(D_{i-1}+D_{i-2})*(i-1))。不过注意到题目要求我们取模,而分母位置有阶乘,所以我们还需要计算阶乘的逆元:

    [x!^{-1}=(prod_{i=1}^{x}i)^{-1}=prod_{i=1}^{x}i^{-1} ]

    因此可以线性计算。

    时间复杂度为(O(N+T))

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define maxn 1000010
    #define mod 1000000007
    using namespace std;
    
    inline int read(){
    	register int x(0),f(1); register char c(getchar());
    	while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
    	while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    	return x*f;
    }
    
    long long inv[maxn],mul[maxn],mul_inv[maxn],d[maxn];
    int T,n,m;
    
    inline void prework(){
    	int n=1000000;
    	mul[0]=mul_inv[0]=1ll;
    	inv[1]=1ll,mul[1]=1ll,mul_inv[1]=1ll;
    	for(register int i=2;i<=n;i++){
    		mul[i]=1ll*mul[i-1]*i%mod;
    		inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
    		mul_inv[i]=1ll*mul_inv[i-1]*inv[i]%mod;
    	}
    	
    	d[0]=1ll,d[1]=0ll,d[2]=1ll;
    	for(register int i=3;i<=n;i++){
    		d[i]=1ll*(i-1)*((0ll+d[i-1]+d[i-2])%mod)%mod;
    	}
    }
    
    int main(){
    	prework();
    	T=read();
    	while(T--){
    		n=read(),m=read();
    		printf("%lld
    ",((1ll*mul_inv[n-m]*mul_inv[m])%mod*mul[n])%mod*d[n-m]%mod);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Elasticsearch 入门教程
    Spring Boot集成JasperReports生成PDF文档
    Java程序员须知的七个日志管理工具
    vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例
    spring boot项目在外部tomcat环境下部署
    linux 如何正确的关闭mongodb
    Centos7下yum安装配置nginx与php
    Centos7 搭建lnmp环境 (centos7+nginx+MySQL5.7.9+PHP7)
    CentOS7安装MySQL
    搭建MySQL高可用负载均衡集群(转)
  • 原文地址:https://www.cnblogs.com/akura/p/11287404.html
Copyright © 2011-2022 走看看