description

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

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

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

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


analysis

  • 首先\(n\)个里有\(m\)个稳定但不确定顺序,所以有\(C^{m}_{n}\)种方案

  • 剩下\(n-m\)个数一定不放在它们数值的位置上,那么就是\(n-m\)个数错排的方案数

  • 设\(f[i]\)表示\(i\)个数错排的方案数,现在要再插入一个数\(n\),前面\(n-1\)个数已经错排

  • \(n\)肯定不能放到第\(n\)位,只能放其他\(n-1\)位

  • 如果把\(n\)插到第某\(k\)位且\(k\)放到\(n\)位,那么剩下\(n-2\)个数仍错排

  • 如果把\(n\)插到第某\(k\)位且\(k\)放到\(n\)位,那么除了\(n\)还有\(n-1\)个数还要错排

  • 由于\(k\)有\(n-1\)种可能,那么\(f[i]=(i-1)*(f[i-1]+f[i-2])\)

  • 如此便解决问题,答案为\(C^{m}_{n}*f[n-m]\)


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAX 1000000
#define mod 1000000007
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i) using namespace std; ll f[MAX+5],fac[MAX+5],inv[MAX+5];
ll n,m,T; inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll pow(ll x,ll y)
{
ll z=1;
while (y)
{
if (y%2)z=z*x%mod;
x=x*x,y>>=1;
}
return z;
}
inline ll C(ll m,ll n)
{
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int main()
{
freopen("permutation.in","r",stdin);
freopen("permutation.out","w",stdout);
f[0]=1,f[1]=0,f[2]=1,fac[0]=1,inv[0]=inv[1]=1;
fo(i,1,MAX)fac[i]=fac[i-1]*i%mod;
fo(i,2,MAX)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
fo(i,2,MAX)inv[i]=inv[i-1]*inv[i]%mod;
fo(i,3,MAX)f[i]=(i-1)*(f[i-1]+f[i-2])%mod;
T=read();
while (T--)
{
n=read(),m=read();
printf("%lld\n",C(m,n)*f[n-m]%mod);
}
return 0;
}

【JZOJ4474】【luoguP4071】排列计数的更多相关文章

  1. BZOJ 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 911  Solved: 566[Submit][Status ...

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

    题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 846  Solved: 530[Submit][ ...

  3. ACM/ICPC 之 DP-浅谈“排列计数” (POJ1037)

    这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列 ...

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

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 434[Submit][Status ...

  5. 【数论·错位排列】bzoj4517 排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1428  Solved: 872[Submit][Statu ...

  6. BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]

    4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...

  7. BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]

    2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1936  Solved: 477[Submit][ ...

  8. bzoj4517排列计数 错排+组合

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1491  Solved: 903[Submit][Statu ...

  9. BZOJ_4517_[Sdoi2016]排列计数_组合数学

    BZOJ_4517_[Sdoi2016]排列计数_组合数学 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[ ...

  10. 2111: [ZJOI2010]Perm 排列计数

    2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i> ...

随机推荐

  1. pytest--fixture之参数化

    场景:测试用例执行时,有的用例需要登陆才能执行,有些用例 不需要登陆.setup和teardown无法满足.fixture可以.默认 scope(范围)function • 步骤: 1. 导入pyte ...

  2. 基于LNMP架构部署wordpress

    [root@localhost ~]# yum -y install unzip[root@localhost ~]# unzip wordpress-5.2.3.zip[root@localhost ...

  3. laravel passport client_credentials

    我是使用 Laravel 5.4 + Dingo Api + passport/jwt 两个验证方式 目前需要用到 passport 的 client_credentials 获取 token成功之后 ...

  4. HttpUrlConnection类基本使用

    这个类用来模拟浏览器向服务器发送请求和接收响应 注意: HttpUrlConnection对象简称huc对象 1)获取huc对象向url构造中传递url字符串,并调用openconnection方法即 ...

  5. leetcood学习笔记-226- 翻转二叉树

    题目描述: 第一次提交: class Solution(object): def invertTree(self, root): """ :type root: Tree ...

  6. 【代码工具】Lombok来优雅的编码

    前言 Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注解实现这一目的. 正文 添加依赖 在 pom.xml ...

  7. php面向对象深入理解(一)

    面向对象(Object Oriented Programming,OOP)的基础知识: 第一个例子:   类Test.class.php <?php class Test{ public $a= ...

  8. 容斥原理解一般不定方程——cf451E经典题

    /* 给定n个盒子,第i个盒子有ai朵花,现在从中选取m朵花,问选取方案数 用容斥定理解决 m=x1+x2+..+xn C(m+n-1,n-1)+sum{ (-1)^p * C(m+n-1-(1+n1 ...

  9. NX二次开发-UFUN创建工程图注释UF_DRF_create_note

    NX9+VS2012 #include <uf.h> #include <uf_drf.h> #include <NXOpen/Annotations_Note.hxx& ...

  10. APIHOOK

    #include <stdio.h> #include <windows.h> #include <Dbghelp.h> #pragma comment(lib,& ...