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. 关于版本管理工具SVN

    曾经使用过Git,但是目前使用的是相对简单的svn. 刚使用的时候,如果不出意外.会有同学配好环境与权限. 前端只需要将代码下载,修改,更新,与上传. 一 .下载 1.本地新建文件夹,作为本地仓库 命 ...

  2. Tomcat Architect

    Tomcat Architect Hierarchy of nested tag representing different components in server.xml. 1 <Serv ...

  3. 30个优秀的CSS技术和实例 By 彬Go 2008-12-04

    在这里可发现很多与众不同的技术,比如:图片集.阴影效果.可扩展按钮.菜单等…这些实例都是使用纯CSS和HTML实现的.单击每个实例的标题可以被转向到该技术实例的相关教程或说明页面(英文),单击每个实例 ...

  4. 上线出现[x86_64, i386]

    echo "Target architectures: $ARCHS" APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}&quo ...

  5. 富文本编辑器 CKeditor 配置使用+上传图片

    参考文献: 富文本编辑器 CKeditor 配置使用 CKEditor与CKFinder的配置(ASP.NET环境),老版本可以参考 CKEditor+CKFinder ASP版在本地电脑中的配置  ...

  6. 2019-7-15-WPF-测试触摸设备发送触摸按下和抬起不成对

    title author date CreateTime categories WPF 测试触摸设备发送触摸按下和抬起不成对 lindexi 2019-7-15 9:3:51 +0800 2019-0 ...

  7. macro `AM_PROG_LIBTOOL’ not found in library

    https://blog.csdn.net/yongcai1/article/details/8693068 yum install libtool

  8. window操作命令

    netstat -ano 查看所有端口 netstat -ano|findstr "8005"  查看指定端口

  9. webpack4.0高级

    环境变量 webpack --env.NODE_ENV=local --env.production --progress Tree Shaking 移除JS上下文字未被引用的代码 只支持ES6的im ...

  10. MyBatis是如何使用的?

    MyBatis前身世iBatis本是Apache的一个开源项目,2010年这个项目迁移到google code并改名为MyBatis. 一.高级软件介绍 1.JDK 8 2.Eclipse mars2 ...