LG4071 [SDOI2016]排列计数
题意
题目描述
求有多少种长度为 n 的序列 A,满足以下条件:
1 ~ n 这 n 个数在序列中各出现了一次
若第 i 个数 A[i] 的值为 i,则称 i 是稳定的。序列恰好有 m 个数是稳定的
满足条件的序列可能很多,序列数对 109+710^9+7109+7 取模。
输入输出格式
输入格式:
第一行一个数 T,表示有 T 组数据。
接下来 T 行,每行两个整数 n、m。
输出格式:
输出 T 行,每行一个数,表示求出的序列数
输入输出样例
说明
测试点 1 ~ 3: T=1000T = 1000 T=1000,n≤8 n \leq 8 n≤8,m≤8 m \leq 8 m≤8;
测试点 4 ~ 6: T=1000T = 1000 T=1000,n≤12 n \leq 12 n≤12,m≤12 m \leq 12 m≤12;
测试点 7 ~ 9: T=1000T = 1000 T=1000,n≤100 n \leq 100 n≤100,m≤100 m \leq 100 m≤100;
测试点 10 ~ 12:T=1000 T = 1000 T=1000,n≤1000 n \leq 1000 n≤1000,m≤1000 m \leq 1000 m≤1000;
测试点 13 ~ 14:T=500000 T = 500000 T=500000,n≤1000 n \leq 1000 n≤1000,m≤1000 m \leq 1000 m≤1000;
测试点 15 ~ 20:T=500000 T = 500000 T=500000,n≤1000000 n \leq 1000000 n≤1000000,m≤1000000 m \leq 1000000 m≤1000000。
分析
选出哪些元素固定,剩下的就是错排问题。
错排数递推公式:
D_n=(n-1)(D_{n-1}+D_{n-2}) \quad n\ge 2
\]
答案为
\]
时间复杂度\(O(n+T)\)
代码
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
co int N=1e6+1,mod=1e9+7;
int num[N]={1,1},inv[N]={1,1},f[N]={1,0};
il int mul(int x,int y){return (ll)x*y%mod;}
int main(){
// freopen(".in","r",stdin),freopen(".out","w",stdout);
for(int i=2;i<N;++i){
num[i]=mul(num[i-1],i);
inv[i]=mul(mod-mod/i,inv[mod%i]);
f[i]=mul(i-1,f[i-1]+f[i-2]);
}
for(int i=2;i<N;++i) inv[i]=mul(inv[i-1],inv[i]);
for(int t=read<int>(),n,m;t--;){
read(n),read(m);
printf("%d\n",mul(num[n],mul(inv[n-m],mul(inv[m],f[n-m]))));
}
return 0;
}
LG4071 [SDOI2016]排列计数的更多相关文章
- BZOJ 4517: [Sdoi2016]排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 911 Solved: 566[Submit][Status ...
- bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)
题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 846 Solved: 530[Submit][ ...
- 数学(错排):BZOJ 4517: [Sdoi2016]排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 693 Solved: 434[Submit][Status ...
- BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]
4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...
- BZOJ_4517_[Sdoi2016]排列计数_组合数学
BZOJ_4517_[Sdoi2016]排列计数_组合数学 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[ ...
- [BZOJ4517][SDOI2016]排列计数(错位排列)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1616 Solved: 985[Submit][Statu ...
- BZOJ 4517: [Sdoi2016]排列计数 错排公式
4517: [Sdoi2016]排列计数 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4517 Description 求有多少种长度为 ...
- 【BZOJ4517】[Sdoi2016]排列计数 组合数+错排
[BZOJ4517][Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值 ...
- BZOJ4517 Sdoi2016 排列计数 【DP+组合计数】*
BZOJ4517 Sdoi2016 排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 ...
随机推荐
- @ResponseBody中文乱码解决方案
java web项目,使用了springmvc4.0,用@ResponseBody返回中文字符串,乱码$$ 本以为很简单的问题,不过也找了一个小时. 网上有说这样配置的: <mvc:annota ...
- 【转】Java中static关键字用法总结
1. 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法. · 它 ...
- Mysql数据库操作语句总结
简单复习下: 增insert into -- 删 delete from -- 改 update table名字 set -- 查 select * from -- 一.SQL定义 SQL(Str ...
- [转]如何远程连接运行OpenGL/Cuda 等GPU程序
发现一篇神文,解决了困扰许久的远程桌面OpenGL/GPU 等问题... 原地址在这:http://www.tanglei.name/how-to-run-gpu-programs-using-rem ...
- 2.15 C++常量指针this
参考: http://www.weixueyuan.net/view/6346.html 总结: 在每一个成员函数中都包含一个常量指针,我们称其为this指针,该指针指向调用本函数的对象,其值为该对象 ...
- C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别
局部变量(Local variables)与 全局变量: 在子程序或代码块中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序 ...
- TortoiseGit 的下载与安装
一.下载 访问https://tortoisegit.org/ 二.安装 然后就next,install 配置参考:2. TortoiseGit安装与配置
- tensorflow-可视化
先学习几个英文单词 summary 汇总,摘要 scope 范围 我这是很早以前的笔记,后来有了博客才发布的,有些内容比较老,懒得改了. 先说明总体流程 暂时不管怎么编程,假设已经有了如下代码,可执 ...
- hph 缓存机制
bufferbuffer是一个内存地址空间,Linux系统默认大小一般为4096(4kb),即一个内存页.主要用于存储速度不同步的设备或者优先级不同的设备之间传办理数据的区域.通过buffer,可以使 ...
- python基础举例应用
将下述两个变量的值交换s1='alex's2='SB's1,s2=s2,s1print(s1,s2) 判断下述结果msg1='alex say my name is alex,my age is 73 ...