【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 个数是 ...
 
随机推荐
- VMware虚拟机下载与安装(内附密钥)
			
VMware下载与安装 一.虚拟机的下载 1.进入VMware官网,点击左侧导航栏中的下载,再点击图中标记的Workstation Pro,如下图所示. 2.根据操作系统选择合适的产品,在这里以Win ...
 - kali下添加用户和权限分配
			
1.添加用户 useradd -m test #-m的意思是创建用户的主目录 2.为用户test设置密码. passwd test 3.为添加的用户赋予权限(-a 添加 :-G 群组) 如果没有这一步 ...
 - thinkphp发送邮箱(以thinkphp5作为示例)。
			
第一步:设置我们的邮箱客户端授权码 第二步:下载相应的第三方类库(我这里用的PHPemail) 这是phpemailde 第三方类库的文件下载地址:https://github.com/PHPMail ...
 - Linux之MariaDB
			
MariaDB数据库的起源 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜 ...
 - C#在textBox中输出一个数组
			
//将数组输出到文本框测试 for(i=0;i<arr.Length-1;i++){ this.textBox1.Text=this.textBox1.Text+arr[i]; }
 - 百度app红包? 百度全家桶?果断卸载
			
听说今年的春晚红包与百度合作.这不 刚又下载了一个百度app,之前下载过,太卡了,用户体验极.本身对百度也没啥好感,再加上这周看了:百度已死的文章,搜索全百家号.具体啥情况,你们百度搜一搜吧
 - 记6种php 加密解密方法
			
<?php function encryptDecrypt($key, $string, $decrypt){ if($decrypt){ $decrypted = rtrim(mcrypt_d ...
 - 强化记忆之php
			
php 输出的区分 新手摸索道路,有说不对的地方,还请多多包涵. echo 能够输出一个以上的字符串,也能输出html标签 print 一次只能接受一个字符串(区分与echo),也能输出html标签 ...
 - eclipse 右键没有Build Path
			
如果Project Explorer右键没有build pathWindow ->show view 选择package explorer 参考https://blog.csdn.net/cod ...
 - 在pythonanywhere上部署Django应用
			
参考:https://tutorial.djangogirls.org/zh/deploy/ 资料讲的很明了,仅在设置上做几点补充. 1.设置相对路径 import os BASE_DIR = os. ...