[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≤8, m≤8;
测试点 4 ~ 6: T=1000, n≤12,m≤12;
测试点 7 ~ 9: T=1000, n≤100, m≤100;
测试点 10 ~ 12: T = 1000,n≤1000, m≤1000;
测试点 13 ~ 14: T = 500000, n≤1000, m≤1000;
测试点 15 ~ 20: T = 500000, n≤1000000,m≤1000000。

题解

突然想感慨一番:在这里插入图片描述

步入正轨↓(我真的很讨厌这种有模数的方案数题)

题意很简单,n个数固定m个数,那么就有n-m个数上的位置是不稳定的
也就是这n-m个数要满足A[i]≠i,对于这n-m中的某个位置i,就只有n-m-1种填法


错排数概念

这里就引入错排数的概念

n个有序的元素应有n!个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排;有的也称之为重排

错排数递推公式及其证明

求n个数的错排数:DP[n]=(n−1)∗(DP[n−1]+DP[n−2])DP[n]=(n-1)*(DP[n-1]+DP[n-2])DP[n]=(n1)(DP[n1]+DP[n2])
证明如下
①考虑第n个元素,把它放在某一个位置,比如位置k,一共有n-1种放法
②考虑第k个元素,这时有两种情况:
(1)把它放到位置n,那么对于除n以外的n-1个元素,由于第k个元素放到了位置n,所以剩下n-2个元素的错排即可,有f(n−2)f(n-2)f(n2)种放法;
(2)第k个元素不放到位置n,这时对于这n-1个元素的错排,有f(n−1)f(n-1)f(n1)种放法
运用加法以及乘法原理,得证完毕。。。


处理完n-m后,我们就要处理m,要知道选的m的位置不同算不同的方案哦(⊙o⊙)!
这个其实就是排列组合,从n个数中选m个的方案数:
Cnm=n!m!∗(n−m)!C_n^m=\frac{n!}{m!*(n-m)!}Cnm=m!(nm)!n!

这里写出来后就发现这里面涉及到了除法,而取模运算中是不能进行除法运算的
所以我们就要去求m!m!m!(n−m)!(n-m)!(nm)!各自的逆元与n!n!n!相乘,
有很多方法都可以完成,费马小定理,扩展欧几里得…


在这里插入图片描述

代码实现

#include <cstdio>
#define mod 1000000007
#define LL long long
#define MAXN 1000000
int T, n, m;
LL sum[MAXN + 5], inv[MAXN + 5], dp[MAXN + 5];
LL qkpow ( LL x, int y ) {LL ans = 1;while ( y ) {if ( y & 1 )ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans % mod;
}
LL getinv ( LL x ) {return qkpow ( x, mod - 2 );
}
int main() {scanf ( "%d", &T );sum[0] = 1;inv[0] = 1;for ( int i = 1;i <= MAXN;i ++ ) {sum[i] = sum[i - 1] * i % mod;inv[i] = getinv ( sum[i] );}dp[0] = dp[2] = 1;for ( int i = 3;i <= MAXN;i ++ )dp[i] = ( dp[i - 1] + dp[i - 2] ) % mod * ( i - 1 ) % mod;while ( T -- ) {scanf ( "%d %d", &n, &m );printf ( "%lld\n", sum[n] * inv[n - m] % mod * inv[m] % mod * dp[n - m] % mod ); }return 0;
} 

byebye~~~~~~
在这里插入图片描述

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

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

相关文章

失配树(border树)

4和6没有border关系 举例子&#xff1a; 当i 3时&#xff0c;j fa[i-1] fa[2] 0 s[j1] s[1] a s[3] 所以把i 3点的父亲设为j1 1 P5829 [模板]失配树

魔方俱乐部

爆肝感动三更题目思路90分代码&#xff08;MLE&#xff09;题解代码实现题目 fateice 来到了魔方俱乐部旅行。 魔方俱乐部有N个分部&#xff0c;每个分部均有且仅有一个虫洞&#xff0c;但是这虫洞只能通往一个分部。 每个分部有一个 orzFang 价值&#xff0c;第i个分部的 or…

模板:最大匹配

文章目录前言代码前言 匈牙利算法 可以解决的问题&#xff1a; &#xff08;原谅我的偷懒&#xff09; &#xff08;原谅我的水文&#xff09; 代码 #include<bits/stdc.h> using namespace std; #define ll long long const int N3e5100; const int mod1e97; int n,…

Stack Overflow 监控系统内部架构初探

Stack Exchange 架构主管 Nick Craver 在最近的一篇文章中介绍了他们的监控系统。他在文章中讨论了监控策略背后的理念和动机&#xff0c;并介绍了他们的工具集——主要是 Bosun、Grafana 和 Opserver。Stack Overflow 及其姐妹站点 Stack Exchange 运行在.NET 和 MS SQL Serve…

P5829 【模板】失配树

P5829 【模板】失配树 题目&#xff1a; 题解&#xff1a; 参考题解 我们先想一个问题&#xff1a;如何求出一个字符串的所有border&#xff1f; 如果一个字符串既是 S的前缀又是 S 的后缀&#xff0c;那么我们把 SS 自己平移一下就可以前后重合&#xff0c;然后我们就可以继…

[JLOI2015]战争调度

文章目录题目题解代码实现题目 脸哥最近来到了一个神奇的王国&#xff0c;王国里的公民每个公民有两个下属或者没有下属&#xff0c;这种关系刚好组成一个 n 层的完全二叉树。 公民 i 的下属是 2 * i 和 2 * i 1。最下层的公民即叶子节点的公民是平民&#xff0c; 平民没有下…

使用PerfView监测.NET程序性能(一):Event Trace for Windows

前言&#xff1a;在日常项目开发中&#xff0c;我们时不时会遇到程序占用了很高CPU的情况&#xff0c;可能是程序里某些未经优化的代码或者Bug&#xff0c;或者是程序运行压力太大。无论是什么原因&#xff0c;我们总希望能看到到底是哪个方法占用了如此高的CPU。微软为我们提供…

【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)

我似乎很少写这种算法博客可持久化线段树概念概念介绍&#xff08;类比帮助理解&#xff09;简单分析一下时间和空间复杂度&#xff08;内容池&#xff09;模板结构体变量建树模板单点修改模板单点查询模板区间修改模板&#xff08;pushup&#xff09;区间修改模板&#xff08;…

P3258 [JLOI2014]松鼠的新家

文章目录题意&#xff1a;题解&#xff1a;树上差分代码&#xff1a;树链剖分代码&#xff1a;P3258 [JLOI2014]松鼠的新家题意&#xff1a; n个点&#xff0c;n-1条边&#xff0c;给出每个点的拜访顺序&#xff0c;问每个点经过几次&#xff08;最后一次移动不算拜访&#xf…

[SOCI2005]最大子矩阵(DP) + [JXOI2018]守卫(DP) + [CQOI2016]手机号码(数位DP)[各种DP专练]

DP专练博客 DP专练T1&#xff1a;最大子矩阵题目题解代码实现T2&#xff1a;守卫题目题解代码实现T3&#xff1a;手机号码题目题解代码实现T1&#xff1a;最大子矩阵 题目 这里有一个n*m的矩阵&#xff0c;请你选出其中k个子矩阵&#xff0c;使得这个k个子矩阵分值之和最大。…

IdentityServer4-EF动态配置Client和对Claims授权(二)

本节介绍Client的ClientCredentials客户端模式&#xff0c;先看下画的草图&#xff1a;一、在Server上添加动态新增Client的API 接口。为了方便测试&#xff0c;在Server服务端中先添加swagger&#xff0c;添加流程可参考&#xff1a;https://www.cnblogs.com/suxinlcq/p/67575…

P3178 [HAOI2015]树上操作

P3178 [HAOI2015]树上操作 题意&#xff1a; 题解&#xff1a; 这已经是很裸的树链剖分了。。。 直接套模板 代码&#xff1a; #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespac…

dotnet core开源博客系统XBlog介绍

XBlog是dotnet core平台下的个人博客开源系统&#xff0c;它只需要通过Copy的方式即可以部署到Linux和windows系统中&#xff1b;如果你有安全证书那只需要简单配置一下即可提供安全的Https服务。接下来主要介绍XBlog功能、部署和基础设置。技术要点基于dotnet core平台&#x…

【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)

文章目录问题引入介绍莫队算法及其实现过程时间复杂度莫队算法适用范围莫队奇偶优化普通莫队&#xff1a;小B的询问树上莫队&#xff1a;SP10707 COT2 - Count on a tree II回滚莫队&#xff1a;[PA2011]Kangaroosupd&#xff1a;2021-08-11&#xff1a;重新对博客进行了外观美…

微软 2018 开源大事记

从微软公开宣布 "Microsoft love linux" 那一刻起&#xff0c;过去的几年里&#xff0c;微软积极拥抱开源的举动我们有目共睹&#xff0c;即便有过"Linux is a cancer"这种真香警告的 flag&#xff0c;但不得不承认的是&#xff0c;微软一系列“拥抱开源”…

模板:二叉搜索树平衡树

文章目录前言二叉搜索树代码treap代码splay开点旋转splay插入查找第k大元素查找给定元素的排名前驱&后继删除完整代码练习总结前言 终于开始学这个东西了 看了好几篇博客才找到一篇可读的qwq 我曾经还以为线段树码量大…我真傻&#xff0c;真的 所谓平衡树&#xff0c;就是…

P2486 [SDOI2011]染色

P2486 [SDOI2011]染色 题意&#xff1a; 题解&#xff1a; 与一般的树链剖分相比&#xff0c;不同点在于查询的不是路径上颜色的数量而是颜色段的数量 对于两个颜色段&#xff0c;112和221&#xff0c;两个颜色段数量都是2 如果合在一起颜色段的数量就是3&#xff0c;因为左边…

牛客网CSP-S提高组赛前集训营1题解(仓鼠的石子游戏 [博弈论] + 乃爱与城市的拥挤程度 [树上DP] + 小w的魔术扑克[dfs + 离线])

文章目录T1&#xff1a;仓鼠的石子游戏题目题解代码实现T2&#xff1a;乃爱与城市拥挤程度题目题解代码实现T3&#xff1a;小w的魔术扑克题目题解代码实现T1&#xff1a;仓鼠的石子游戏 题目 仓鼠和兔子被禁止玩电脑&#xff0c;无聊的他们跑到一块空地上&#xff0c;空地上有…

使用PerfView监测.NET程序性能(二):Perfview的使用

在上一篇博客使用PerfView监测.NET程序性能&#xff08;一&#xff09;&#xff1a;Event Trace for Windows 中&#xff0c;我们了解了对Windows及应用程序进行性能分析的基础&#xff1a;Event Trace for Windows (ETW)。现在来看看基于ETW的性能分析工具——Perfview.exePer…

学习有向图和无向图的强连通分量(基本概念+割点+点双联通分量+桥+边双连通分量+全套模板【Tarjan】)

最近总是考到Tarjan&#xff0c;让我措手不及基本概念割点以及点双连通分量Tarjan法求割点推导过程代码实现Tarjan法求点双连通分量推导过程代码实现有向图的Tarjan缩点桥与边双连通分量Tarjan法求桥理论推导代码实现Tarjan法求边双连通分量理论推导代码实现前言&#xff1a;有…