博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P4071-[SDOI2016]排列计数【组合计数,错排】
阅读量:2022 次
发布时间:2019-04-28

本文共 879 字,大约阅读时间需要 2 分钟。

正题

题目链接:


题目大意

每次询问 n , m n,m n,m。求有多少个 n n n的排列使得 a i = i a_i=i ai=i的数量恰好为 m m m个。


解题思路

首先 n n n个之中选择 m m m a i = i a_i=i ai=i,选择的方案数为 C n m C_{n}^m Cnm。剩下的错排就好了

错排推导 d i = ( i − 1 ) ( d i − 1 + d i − 2 ) d_i=(i-1)(d_{i-1}+d_{i-2}) di=(i1)(di1+di2)

所以答案就是 C n m ∗ d n − m C_n^m*d_{n-m} Cnmdnm

预处理即可。


c o d e code code

#include
#include
#include
#define ll long longusing namespace std;const ll N=1e6+10,XJQ=1e9+7;ll T,n,m,d[N],fac[N];ll power(ll x,ll b){
ll ans=1; while(b){
if(b&1) ans=ans*x%XJQ; x=x*x%XJQ;b>>=1; } return ans;}ll C(ll n,ll m){
return fac[n]*power(fac[m]*fac[n-m]%XJQ,XJQ-2)%XJQ;}int main(){
scanf("%lld",&T); d[0]=d[2]=fac[1]=fac[0]=1;fac[2]=2; for(ll i=3;i<=1000000;i++) fac[i]=fac[i-1]*i%XJQ, d[i]=(i-1)*(d[i-1]+d[i-2])%XJQ; while(T--){
scanf("%lld%lld",&n,&m); printf("%lld\n",C(n,m)*d[n-m]%XJQ); }}

转载地址:http://auwaf.baihongyu.com/

你可能感兴趣的文章
linux内核介绍之开机启动过程
查看>>
linux下c编程之信号量semget,semop,semctl函数
查看>>
linux下c编程之内存共享shemget函数的实现及案例-bmi体重身高测试2
查看>>
linux下c编程之内存共享shemget函数的实现及案例-bmi体重身高测试1
查看>>
linux下c编程之无名管道pipe()函数
查看>>
linux下c编程系统调用之有名管道FIFO函数的使用及案例
查看>>
linux下c编程系统函数调用之信息队列
查看>>
dl动态链接文件函数
查看>>
enum枚举介绍
查看>>
<dlfcn.h>
查看>>
线程函数pthread_cleanup_push()
查看>>
什么是博士?
查看>>
高效编程的秘诀
查看>>
如何找到研究点
查看>>
开源的Web开发资源
查看>>
单点登录:spring-security-cas
查看>>
网页静态化(freemarker)
查看>>
spring加载配置文件无法解析占位符问题:Could not resolve placeholder 'from' in string value "${from}"...
查看>>
net.sf.json.JSONException: java.lang.reflect.InvocationTargetException解决方法
查看>>
hibernate:Caused by: org.hibernate.MappingException: Repeated column in mapping for entity
查看>>