洛谷P4071 [SDOI2016] 排列计数 [组合数学]
排列计数
题目描述
求有多少种长度为 n 的序列 A,满足以下条件:
1 ~ n 这 n 个数在序列中各出现了一次
若第 i 个数 A[i] 的值为 i,则称 i 是稳定的。序列恰好有 m 个数是稳定的
满足条件的序列可能很多,序列数对 $10^9+7$ 取模。
输入输出格式
输入格式:
第一行一个数 T,表示有 T 组数据。
接下来 T 行,每行两个整数 n、m。
输出格式:
输出 T 行,每行一个数,表示求出的序列数
输入输出样例
5
1 0
1 1
5 2
100 50
10000 5000
0
1
20
578028887
60695423
说明
测试点 1 ~ 3: $T=1000,n \leq 8,m \leq 8$;
测试点 4 ~ 6: $T=1000,n \leq 12,m \leq 12$;
测试点 7 ~ 9: $T=1000,n \leq 100,m \leq 100$;
测试点 10 ~ 12:$T=1000,n \leq 1000,m \leq 1000$;
测试点 13 ~ 14:$T=500000,n \leq 1000,m \leq 1000$;
测试点 15 ~ 20:$T=500000,n \leq 1000000,m \leq 1000000$
分析:
一道组合数、错排公式的模板。
很显然可以推出公式是$D_{n-m} \times C^m_n$,那么我们只要预处理即可。
错排公式的递推式:$D_n=(n-1) \times (D_{n-1}+D_{n-2})$,组合数的阶乘公式:$C^m_n=\frac{n!}{m! \times (n-m)!}$。
只要预处理$D$数组和数据范围内所有数的阶乘$jc[i]$以及$jc[i]$的逆元$ny[i]$即可。这里求逆元可以直接费马小定理,因为模数是质数。
Code:
//It is made by HolseLee on 14th Sep 2018
//Luogu.org P4071
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; typedef long long ll;
const int N=1e6+;
const ll mod=1e9+;
int T,n,m;
ll jc[N],ny[N],d[N]; template<typename re>
inline void read(re &x)
{
x=; char ch=getchar(); bool flag=false;
while( ch<'' || ch>'' ) {
if( ch=='-' ) flag=true; ch=getchar();
}
while( ch>='' && ch<='' ) {
x=x*+ch-''; ch=getchar();
}
flag ? x=-x : ;
} inline ll power(ll x,ll y)
{
ll ret=;
while( y ) {
if( y& ) ret=(ret*x)%mod;
y>>=, x=(x*x)%mod;
}
return ret;
} void ready()
{
d[]=, d[]=, jc[]=, ny[]=;
for(int i=; i<N; ++i) d[i]=((i-)*(d[i-]+d[i-])+mod)%mod;
for(int i=; i<N; ++i) {
jc[i]=((jc[i-]*i)+mod)%mod;
ny[i]=power(jc[i],mod-);
}
} int main()
{
read(T); ready();
while( T-- ) {
read(n), read(m);
if( m==n ) puts("");
else if( m>n ) puts("");
else if( m== ) printf("%lld\n",d[n]);
else {
printf("%lld\n",((d[n-m]*(ny[m]*ny[n-m]%mod))%mod*jc[n])%mod);
}
}
return ;
}
洛谷P4071 [SDOI2016] 排列计数 [组合数学]的更多相关文章
- 洛谷——P4071 [SDOI2016]排列计数(错排+组合数学)
P4071 [SDOI2016]排列计数 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列 ...
- 洛谷 P4071 [SDOI2016]排列计数 题解
P4071 [SDOI2016]排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳 ...
- 洛谷 P4071 [SDOI2016]排列计数
洛谷 这是一道组合数学题. 对于一个长为n的序列,首先我们要选m个使之稳定\(C^{m}_{n}\). 且要保证剩下的序列不稳定,即错排\(D_{n-m}\). 所以答案就是:\[ANS=C^{m}_ ...
- 洛谷P2606 [ZJOI2010]排列计数 组合数学+DP
题意:称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大, ...
- bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)
题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 846 Solved: 530[Submit][ ...
- [SDOI2016] 排列计数 (组合数学)
[SDOI2016]排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- P4071 [SDOI2016]排列计数
题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条 ...
- 洛谷P2606 [ZJOI2010]排列计数(组合数 dp)
题意 题目链接 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案 ...
随机推荐
- gcc和MinGW的异同
cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从 ...
- python---Celery分布式任务队列了解
linux下定时器了解 Celery 框架学习笔记(不错哟) Celery 分布式任务队列快速入门 Celery的最佳实践 一.Celery介绍 Celery 是一个 基于python开发的分布式异步 ...
- Lucene 查询分页技术
常用的Lucene查询代码如下所示,该代码的作用是将path路径下的所有索引信息返回 public String matchAll(String path) { try { Directory dir ...
- Mongodb 备份 还原 导出 导入 等批量操作
mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport. 一,mongodump备份数 ...
- 使用git上传项目到GitHub上
之前的博客有<使用git拉取GitHub上的项目>的文章,那么现在说一下,如何上传项目到GitHub上. 1. Git的.gitignore 文档配置 因为项目中可能有很多的图片还有nod ...
- Unsupervised learning, attention, and other mysteries
Unsupervised learning, attention, and other mysteries Get notified when our free report “Future of M ...
- c# 一个关于时间截断的算法取巧
场景如下: 在某一段时间内(有规律,以一个星期为最大区间),从一个时间区间中排除另外一个或者多个时间区间后,返回时间区间集合. 举例如下: //时间区间:2018-02-01~2018-02-07 / ...
- CSS进阶知识
html { -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; text-size-adjust: 100%; } 该属性的作用是 ...
- 利用PhantomJS生成网站截图
var page = require('webpage').create(); page.open('http://qq.com', function () { page.render('exampl ...
- 【BZOJ】2331: [SCOI2011]地板 插头DP
[题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...