【bzoj4517】[Sdoi2016]排列计数 组合数+dp
题目描述
输入
输出
输出 T 行,每行一个数,表示求出的序列数
样例输入
5
1 0
1 1
5 2
100 50
10000 5000
样例输出
0
1
20
578028887
60695423
题解
组合数+dp
题目中说n个数有m个稳定的,有n-m个不稳定的,那么我们可以从这n个数中选出m个作为稳定的数,其余的n-m个作为不稳定的数。
n选m需要用到组合数,然而n和m太大不能递推来求。
考虑到C(n,m)=n!/(m!(n-m)!),我们可以先预处理阶乘模MOD的值,再用乘法逆元。
而这里的MOD为质数,根据费马小定理,ap≡a(mod p),即ap-1≡1(mod p),即a*ap-2≡1(mod p),即1/a≡ap-2(mod p)
所以直接用快速幂求aMOD-2就是乘法逆元。
然后是n-m个不稳定的,即错排,dp公式:f[n]=(n-1)*(f[n-1]+f[n-2])
解释:第n个物品有n-1个位置可选,假设选定了k位置,考虑k的选择分两种,不选n和选n。不选n的情况,将n看作k,即k不能选择自身,转化为f[n-1];选N的情况即f[n-2]。
乘起来模上MOD即可。
#include <cstdio>
#define N 1000010
#define MOD 1000000007
typedef long long ll;
ll fac[N] , f[N];
ll qpow(ll x , int y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = (ans * x) % MOD;
x = (x * x) % MOD , y >>= 1;
}
return ans;
}
int main()
{
int i , T , n , m;
fac[0] = 1;
for(i = 1 ; i <= 1000000 ; i ++ ) fac[i] = fac[i - 1] * i % MOD;
f[0] = 1 , f[1] = 0;
for(i = 2 ; i <= 1000000 ; i ++ ) f[i] = (i - 1) * (f[i - 1] + f[i - 2]) % MOD;
scanf("%d" , &T);
while(T -- )
{
scanf("%d%d" , &n , &m);
printf("%lld\n" , qpow(fac[m] , MOD - 2) * qpow(fac[n - m] , MOD - 2) % MOD * fac[n] % MOD * f[n - m] % MOD);
}
return 0;
}
【bzoj4517】[Sdoi2016]排列计数 组合数+dp的更多相关文章
- BZOJ4517 Sdoi2016 排列计数 【DP+组合计数】*
BZOJ4517 Sdoi2016 排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 ...
- bzoj4517[Sdoi2016]排列计数(组合数,错排)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1792 Solved: 1111[Submit][Stat ...
- BZOJ4517: [Sdoi2016]排列计数(组合数+错位排列)
Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1626 Solved: 994[Submit][Status][Discuss] Descripti ...
- 【BZOJ4517】[Sdoi2016]排列计数 组合数+错排
[BZOJ4517][Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值 ...
- [BZOJ4517][SDOI2016]排列计数(错位排列)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1616 Solved: 985[Submit][Statu ...
- BZOJ4517 [Sdoi2016]排列计数 【组合数 + dp】
题目 求有多少种长度为 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的,答案 ...
- bzoj4517: [Sdoi2016]排列计数--数学+拓展欧几里得
这道题是数学题,由题目可知,m个稳定数的取法是Cnm 然后剩下n-m本书,由于编号为i的书不能放在i位置,因此其方法数应由错排公式决定,即D(n-m) 错排公式:D[i]=(i-1)*(D[i-1]+ ...
- [BZOJ4517] [Sdoi2016] 排列计数 (数学)
Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是 ...
随机推荐
- javaweb--json--ajax--mysql实现省市区三级联动(附三级联动数据库)
在web中,实现三级联动很常见,尤其是利用jquery+json.但是从根本上来说jquery并不是最能让人容易理解的,接下来从最基本的javascript开始,实现由javascript+json+ ...
- Kubernetes中的Ingress
Ingress是什么 Ingress :简单理解就是个规则定义:比如说某个域名对应某个 service,即当某个域名的请求进来时转发给某个 service;这个规则将与 Ingress Control ...
- python的列表数据类型及常用操作
列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 列表可以进行的操作包括索 ...
- 仿制用友U8界面
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...
- 【转】mybatis调用mssql有输入输出参数那种..
吐槽下,百度的搜索能力真心垃圾(有可能是我没想好关键词的缘故吧..)... 谷歌中国程序员呼唤你... 这面这边文章是别人的,感觉不错,转过来. http://lohasle.iteye.com/bl ...
- SQL Server中2008及以上 ldf 文件过大的解决方法
在SQL Server中经常遇到事务日志变大的情况,除了将数据库设置为“自动收缩”外,还可以使用下面的SQL命令进行快速清除数据库中的事务日志,命令如下: - 第一步:清空日志 ALTER DAT ...
- 源码-集合:ArrayList
只是文章摘录,还未研究 JAVA ArrayList详细介绍(示例) http://www.jb51.net/article/42764.htm Jdk1.6 JUC源码解析汇总 - 永远保持敬畏之心 ...
- javac、jar使用实录
因项目管理部署需要,记录一下过程,以免下次忘记了,再次使用又需要重头再来,只记录正确的操作方式,可能会提到某些错误 建立项目所在目录F:\www 案例一 其下建立项目的java源文件的包目录结构.ja ...
- jmeter插件之jsonpath提取响应结果和做断言
准备工作: 1. jmeter3.X已经自带了提取响应结果的插件:JSON Extractor 2. 下载断言插件:https://jmeter-plugins.org/wiki/JSONPathAs ...
- js字符编码笔记
一. 什么是unicode? ascii码能表示的字符非常有限(128个字符),这对英文来说足够了,但是对法文.中文.土耳奇文等文字则远远不够,于是就产生了新的编码规则-unicode,unicod ...