洛谷P4071 排列计数

传送门:

P4071 [SDOI2016] 排列计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P4071题干:

有多少个1到n的排列a,使得恰好有m个位置满足ai = i , 回答T组询问,答案多 10^9+7取模

数据范围: n,m<=1e6, T<=1e5;

思路:

第一步:假设有m个位置满足ai=i,先从n个数字里面选出m个位置,然后把它们放到它们应该在的地方。

一共有C(n,m)种方案 。

第二步:求剩下的n-m个数字 错排的情况有多少种,

假设 d(x)表示 t个数字错排的情况,那么由公式可得:

d(x) = (x-1) ( d(x-1) + d(x-2) ) 

很明显满足递推关系。

所以答案就是: C(n,m)*  (n-m-1)* ( d(x-1)+d(x-2) )  % P

如何求组合数? 我们都知道公式     C_{n}^{m}=\frac{n!}{m!(n-m)!}

要求 整个式子模P的值怎么求呢?

第一步,预处理 所有的阶乘模上P的值,放进一个数组frc。

第二步,设置一个求逆元的函数inv(),由于模数是质数,所以我们考虑用快速幂。

又由于第一步已经求了所有的阶乘,所以第二步,我们用上面的结果就可,求出m!,(n-m)!

的逆元,然后相乘取模: inv(m!)*inv((n-m)!) *  n!   (mod p)

第三步,预处理所有的错排情况,存入数组D。

(别忘了特判一下,n==m的情况)

最后美美滴写答案就可以了。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cctype>
#include<map>
#include<set>
#include<queue>
#include<numeric>
#include<iomanip>
using namespace std;typedef long long ll;
const ll N = 1e6+7;
const ll M = 1e6+7;
const ll P = 1e9 + 7;
ll get_inv(ll a, ll b) {ll s = 1;while (b) {if (b & 1)s = s * a % P;a = a * a % P;b >>= 1;}return s;
}
ll frc[N];
void get_frc(void) {for (ll i = 1; i <= N; i++) {frc[i] = frc[i - 1] * i % P;}
}
ll D[N];
void get_d() {for (ll i = 3; i <= N; i++) {D[i] = ((i - 1)) * (D[i - 1] + D[i - 2]) % P;}
}int main() {frc[0] = 1;D[1] = 0;D[2] = 1;get_d();get_frc();ll t;cin >> t;while (t--) {ll n, m;cin >> n >> m;if (n == m)cout << 1 << endl;else {ll sum = get_inv(frc[m], P - 2)%P  * get_inv(frc[n - m], P - 2)%P  * frc[n]%P  * D[n - m] % P;cout << sum<<endl;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/264638.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌云数据中心利用地热能实现能源转型突破

随着全球气候变化问题日益严重&#xff0c;各大公司纷纷寻求更加可持续的能源解决方案。作为科技巨头的谷歌&#xff0c;近日在内华达州的数据中心取得了突破性的进展&#xff0c;开始使用100%地热能供电&#xff0c;为全球数据中心能源转型树立了新的标杆。 作为全球最大的搜…

高项备考葵花宝典-项目进度管理核心概念加强记忆

项目进度管理的核心目标是使项目按时完成。 目录 一、待办事项列表 二、看板方法 三、在制品 四、进度计划模型 五、活动清单 六、里程碑清单 七、前导图法 八、资源日历 九、活动历时估算方法 一、待办事项列表 如上图所示&#xff0c;实际工作中需求往往不是一次性全…

ActiveMQ 反序列化漏洞(CVE-2015-5254)

ActiveMQ 反序列化漏洞 Apache ActiveMQ是一种开源的消息代理&#xff08;message broker&#xff09;&#xff0c;被广泛用于应用程序之间的消息传递。它提供可靠的消息传递模式&#xff0c;如发布/订阅、点对点和请求/响应&#xff0c;非常适合构建分布式系统和应用程序集成…

mybaits 如果有自增主键id 无法从前端获取 解决方法

可以看到这个表id键是自增的 useGeneratedKeys"true" 表示要使用数据库自动生成的键&#xff08;例如自增主键&#xff09;&#xff0c;而 keyProperty"id" 则指定了用于存储生成的键值的属性名。

虚拟化之通用计时器

Arm架构包含通用定时器(Generic Timer),这是每个处理器中都有的一组标准化定时器。通用定时器包括一组比较器,这些比较器与一个共同的系统计数进行比较。当比较器的值等于或小于系统计数时,该比较器会生成中断。在下图中,我们可以看到系统中的通用定时器(橙色)以及其比…

Flutter视频播放器在iOS端和Android端都能实现全屏播放

Flutter开发过程中&#xff0c;对于视频播放的三方组件有很多&#xff0c;在Android端适配都挺好&#xff0c;但是在适配iPhone手机的时候&#xff0c;如果设置了UIInterfaceOrientationLandscapeLeft和UIInterfaceOrientationLandscapeRight都为false的情况下&#xff0c;无法…

JRT文件服务实现

网站与客户端打印和导出方面已经无大碍了&#xff0c;今天抽时间整整文件服务&#xff0c;文件服务设计可以查看下面连接。原理一样&#xff0c;代码会有些变化。 文件服务设计 首先实现文件服务的服务端&#xff0c;就是一个业务脚本&#xff0c;用来接收上传、移动和删除文件…

代码随想录二刷 |二叉树 |101. 对称二叉树

代码随想录二刷 &#xff5c;二叉树 &#xff5c;101. 对称二叉树 题目描述解题思路 & 代码实现递归法迭代法使用队列使用栈 题目描述 101.对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,…

推荐4个优秀的 Python 时间序列分析库

时间序列分析在金融和医疗保健等领域至关重要&#xff0c;在这些领域&#xff0c;理解随时间变化的数据模式至关重要。在本文中&#xff0c;我们将介绍四个主要的Python库——statmodels、tslearn、tssearch和tsfresh——每个库都针对时间序列分析的不同方面进行了定制。这些库…

调度算法1

一、 先来先服务FCFS&#xff08;First Come First Serve) 先来先服务"&#xff08;First Come, First Served&#xff0c;简称FCFS&#xff09;是一种调度算法&#xff0c;常用于处理队列中的任务或进程。它的基本原则是按照任务或进程到达的顺序进行处理&#xff0c;即先…

基于SSM的医院交互系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

AWR1642 boost开发板支持的TI参考设计

打开radar_toolbox_1_30_00_05\source\ti\examples\examples_overview,通过输入“1642”查找AWR1642 BOOST支持的参考设计,通过筛选,支持AWR1642 BOOST的参考设计如下: 挑选出两个参考设计上手,一个是“nonos_oob_16xx",不带OS;另一个是”short range radar“,比较…