洛谷 P4071 [SDOI2016]排列计数 题解
P4071 [SDOI2016]排列计数
题目描述
求有多少种长度为 n 的序列 A,满足以下条件:
1 ~ n 这 n 个数在序列中各出现了一次
若第 i 个数 A[i] 的值为 i,则称 i 是稳定的。序列恰好有 m 个数是稳定的
满足条件的序列可能很多,序列数对 \(10^9+7\) 取模。
输入格式
第一行一个数 T,表示有 T 组数据。
接下来 T 行,每行两个整数 n、m。
输出格式
输出 T 行,每行一个数,表示求出的序列数
输入输出样例
输入 #1
5
1 0
1 1
5 2
100 50
10000 5000
输出 #1
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$。
【思路】
组合数学 / 错排
【题目大意】
a[i]在i的位置上面是稳定的
求有m个数是稳定的序列有多少个
【题目分析】
求符合条件序列的个数
符合条件序列可以先只看那稳定的数
一个序列中只有m个数是稳定的
其他的都是稳定的
那么稳定的数组合方式就是n个数里面取m个
因为如果稳定那一个数只对应一个位置
所以不存在顺序这一说,所以就是 \(C_n^m\)
知道了稳定数的组合方式
拿在看看除了这些稳定数之外数的组合方式
其他的数都是不在自己的位置上面的
也就是错排
直接用错排求出n-m(这里是减号下同下下同)个人错排方法的数量就好了
因为一种稳定数对应n-m个人的错排方式
所以数量数就是 \(C_n^m\) * (n-m)个人的错排方式
【存在的问题】
1.因为n和m的数据范围都是小于等于1e6
不是很小,而且T很大,
所以每次T 不能都单独求C和错排次数了
这样一定会超时
2.因为这道题中有取模运算
而递推求组合数只能过2000所以用这个阶乘求组合数就是必然的了
那么就要用到除法
而取模运算中不能用除法
【优化】
1.针对问题1
多次求解会超时
那就先预处理出来所有的阶乘和i个人的错排方式
到时候O(1)查询就好了
2.针对问题2
既然不能用除法那就用乘法
用逆元来代替除法就可以啦
求逆元因为模数是质数
所以可以用费马小定理求
费马小定理求逆元详见
这里
【完整代码】
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
const int k = 1e9 + 7;
const int Max = 1000005;
int d[Max];
int f[Max];
int inv[Max];
int p(int a,int b)
{
int ans = 1;
while(b)
{
if(b & 1)
ans = ans * a % k;
b >>= 1;
a = a * a % k;
}
return ans;
}
signed main()
{
d[0] = 1,d[2] = 1;
for(register int i = 3;i <= 1000000;++ i)
d[i] = (i - 1) * (d[i - 1] + d[i - 2]) % k;
f[0] = 1,f[1] = 1;
for(register int i = 2;i <= 1000000;++ i)
f[i] = f[i - 1] * i % k;
inv[0] = p(f[0],k - 2);
for(register int i = 1;i <= 1000000;++ i)
inv[i] = p(f[i],k - 2) % k;
int t;
cin >> t;
while(t --)
{
int n,m;
scanf("%lld%lld",&n,&m);
//c(n,m) * d(n-m)
//n!/m!(n - m)! * d[n-m]
printf("%lld\n",(f[n] * inv[m] % k * inv[n-m] % k * d[n-m]) % k);
}
return 0;
}
洛谷 P4071 [SDOI2016]排列计数 题解的更多相关文章
- 洛谷——P4071 [SDOI2016]排列计数(错排+组合数学)
P4071 [SDOI2016]排列计数 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列 ...
- 洛谷P4071 [SDOI2016] 排列计数 [组合数学]
题目传送门 排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m ...
- 洛谷 P4071 [SDOI2016]排列计数
洛谷 这是一道组合数学题. 对于一个长为n的序列,首先我们要选m个使之稳定\(C^{m}_{n}\). 且要保证剩下的序列不稳定,即错排\(D_{n-m}\). 所以答案就是:\[ANS=C^{m}_ ...
- P4071 [SDOI2016]排列计数 题解
分析: 线性求逆元:https://blog.csdn.net/qq_34564984/article/details/52292502 代码: #include<cstdio> usin ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- BZOJ4517 & 洛谷4071:[SDOI2016]排列计数——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4517 https://www.luogu.org/problemnew/show/P4071 求有 ...
- ●洛谷P2606 [ZJOI2010]排列计数
题链: https://www.luogu.org/problemnew/show/P2606题解: 组合数(DP),Lucas定理 首先应该容易看出,这个排列其实是一个小顶堆. 然后我们可以考虑dp ...
- 洛谷P2606 [ZJOI2010]排列计数
题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很 ...
- 洛谷P2606 [ZJOI2010]排列计数(数位dp)
题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很 ...
随机推荐
- CentOS7 安装 Docker、最佳Docker学习文档
目录 一.Docker支持 二.安装Docker -1.在新主机上首次安装Docker CE之前,需要设置Docker存储库.之后,就可以从存储库安装和更新Docker. 0.卸载旧版 1.正式安装 ...
- nginx+lua访问流量实时上报kafka
在nginx这一层,接收到访问请求的时候,就把请求的流量上报发送给kafka storm才能去消费kafka中的实时的访问日志,然后去进行缓存热数据的统计 从lua脚本直接创建一个kafka prod ...
- 深度剖析java中JDK动态代理机制
https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...
- Tomcat6项目移到Tomcat7 提示 404 解决方案
一个项目在Tomcat6可以运行和正常访问,但是一部署到Tomcat7就提示404错误.那么可以通过以下方法解决: 找到项目下面的 WEB-INF 文件夹 用记事本打开 WEB.XML 找 ...
- python 3.url了解与基础使用
URL使用 视图: 我们运行项目在网页上查看到的我们称之为视图 视图一般在views.py下编辑 它的第一个参数永远都是request,通过它请求一些数据返回给网页给我们查看. 视图函数的返回结果必须 ...
- map小列
// 有关学生信息的头文件student.h代码如下 #include #include using namespace std; struct Student ...
- ansible 中 JAVA_HOME不生效问题
解决方案 ~/.bash_profile 是交互式.login 方式进入 bash 运行的,意思是只有用户登录时才会生效. ~/.bashrc 是交互式 non-login 方式进入 bash 运行的 ...
- 第9章 运行TensorFlow
目录 第9章 运行TensorFlow 创建一个计算图并在会话中执行 管理图 节点值的生命周期 TensorFlow中的线性回归 实现梯度下降 给训练算法提供数据 保存和恢复模型 用TensorBoa ...
- Cypress自动化环境搭建
1.Cypress 下载: 官网下载,下载后直接解压即可,解压后便可单机exe文件打开 Ps:直接打开exe是会报错找不到json文件的,所以还要安装依赖环境 运行cypress项目前,必须vue-c ...
- Cloudera Certified Associate Administrator案例之Install篇
Cloudera Certified Associate Administrator案例之Install篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建主机模板(为了给主 ...