4517: [Sdoi2016]排列计数

Description

求有多少种长度为 n 的序列 A,满足以下条件:
1 ~ n 这 n 个数在序列中各出现了一次
若第 i 个数 A[i] 的值为 i,则称 i 是稳定的。序列恰好有 m 个数是稳定的
满足条件的序列可能很多,序列数对 10^9+7 取模。

Solution

答案是:\(C(n,m)*D(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;
const int N=1000005,mod=1e9+7;
int Fac[N],D[N],T,inv[N],n,m,Inv[N];
inline int C(int a,int b){return 1ll*Fac[a]*Inv[b]%mod*Inv[a-b]%mod;}
int main(){
  freopen("pp.in","r",stdin);
  freopen("pp.out","w",stdout);
  scanf("%d",&T);
  Fac[0]=D[0]=Fac[1]=inv[0]=inv[1]=Inv[0]=Inv[1]=1;
  for(int i=2;i<N;i++){
      Fac[i]=1ll*Fac[i-1]*i%mod;
      inv[i]=(-1ll*(mod/i)*inv[mod%i]%mod+mod)%mod;
      Inv[i]=1ll*Inv[i-1]*inv[i]%mod;
      D[i]=(D[i-1]+(i&1?-1:1)*Inv[i])%mod;
      if(D[i]<0)D[i]+=mod;
  }
  for(int i=0;i<N;i++)D[i]=1ll*D[i]*Fac[i]%mod;
  while(T--){
      scanf("%d%d",&n,&m);
      printf("%lld\n",1ll*D[n-m]*C(n,m)%mod);
  }
  return 0;
}

原文地址:https://www.cnblogs.com/Yuzao/p/8453868.html

时间: 2024-08-29 06:28:09

4517: [Sdoi2016]排列计数的相关文章

BZOJ 4517: [Sdoi2016]排列计数 错排+逆元

4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. T=500000,n≤1000000,m≤1000000 Output 输出 T 行,每行一个数,表示

bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)

题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 846  Solved: 530[Submit][Status][Discuss] Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. I

数学(错排):BZOJ 4517: [Sdoi2016]排列计数

4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 434[Submit][Status][Discuss] Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第

BZOJ 4517: [Sdoi2016]排列计数

4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 911  Solved: 566[Submit][Status][Discuss] Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第

bzoj 4517: [Sdoi2016]排列计数【容斥原理+组合数学】

第一个一眼就A的容斥题! 这个显然是容斥的经典问题------错排,首先考虑没有固定的情况,设\( D_n \)为\( n \)个数字的错排方案数. \[ D_n=n!-\sum_{t=1}^{n}(-1)^{t-1}\sum_{i_1<i_2<...<i_t}(n-t)! \] \[ D_n=n!+\sum_{t=1}^{n}(-1)^tC_{n}^{t}(n-t)! \] \[ D_n=n!+\sum(-1)^t\frac{n!}{t!} \] 推到这一步就可以了,然后观察数据范围显

【BZOJ4517】[Sdoi2016]排列计数 组合数+错排

[BZOJ4517][Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. T=500000,n≤1000000,m≤1000000 Output 输出 T 行,每行一个

[Sdoi2016]排列计数

问题 A: [Sdoi2016]排列计数 时间限制: 3 Sec  内存限制: 512 MB 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. 输入 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. T=500000,n≤1000000,m≤1000000 输出 输出

[SDOI2016] 排列计数 (组合数学)

[SDOI2016]排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7109+7 取模. 输入输出格式 输入格式: 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. 输出格式: 输出 T 行,每行一个数,表示求出的序列数 输入输出样例 输入样例#1: 5 1 0 1 1

[BZOJ4517] [Sdoi2016] 排列计数 (数学)

Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. T=500000,n≤1000000,m≤1000000 Output 输出 T 行,每行一个数,表示求出的序列数 Sample Input 5