BZOJ 4517--[Sdoi2016]排列计数(乘法逆元)
4517: [Sdoi2016]排列计数
Time Limit: 60 Sec Memory Limit: 128 MB
Submit: 1727 Solved: 1067
Description
Input
Output
输出 T 行,每行一个数,表示求出的序列数
Sample Input
1 0
1 1
5 2
100 50
10000 5000
Sample Output
1
20
578028887
60695423
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=4517
Solution
显然对于一次询问,只要选定m个数放在原位,然后使其他数字都不放在原位即可。。
设f [ i ]表示长度为i的每一位a [ i ] ! = i的方案数。。
于是答案显然就是C(n,m) * f [ n-m ]。。。
组合数可以用乘法逆元解决。。
考虑怎么处理f [ i ]。。首先打表可知f [ i ]一定是(i-1)的倍数。。。
f[1]=0
f[2]=1 f[2]/1=1
f[3]=2 f[3]/2=1
f[4]=9 f[4]/3=3
f[5]=44 f[5]/4=11
f[6]=265 f[6]/5=53
显然可以发现 f [ i ] / ( i - 1 ) = f [ i - 1 ] + f [ i - 2 ]
于是 f [ i ] = ( f [ i - 1 ] + f [ i - 2 ] ) * ( i - 1 )
O(n)递推,O(1)询问。。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define pa pair<LL,LL>
#define LL long long
using namespace std;
inline LL read(){
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void Out(LL a){
if(a>9) Out(a/10);
putchar(a%10+'0');
}
const LL inf=1e9+10;
const LL mod=1e9+7;
const int N=1000050;
LL n,m;
LL f[N+50],jc[N+50],ny[N+50];
LL C(LL x,LL y){
return jc[y]*ny[x]%mod*ny[y-x]%mod;
}
int main(){
f[0]=1;f[1]=0;
jc[0]=jc[1]=ny[0]=ny[1]=1;
for(LL i=2;i<=N;++i){
f[i]=(f[i-1]+f[i-2])%mod*(i-1)%mod;
ny[i]=(mod-mod/i)*ny[mod%i]%mod;
}
for(LL i=2;i<=N;++i){
ny[i]=ny[i-1]*ny[i]%mod;
jc[i]=jc[i-1]*i%mod;
}
int T;scanf("%d",&T);
LL ans;
while(T--){
n=read();m=read();
ans=C(m,n)*f[n-m]%mod;
Out(ans);puts("");
}
return 0;
}
This passage is made by Iscream-2001.
BZOJ 4517--[Sdoi2016]排列计数(乘法逆元)的更多相关文章
- BZOJ 4517: [Sdoi2016]排列计数 错排+逆元
4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i, ...
- BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]
4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...
- BZOJ 4517: [Sdoi2016]排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 911 Solved: 566[Submit][Status ...
- 数学(错排):BZOJ 4517: [Sdoi2016]排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 693 Solved: 434[Submit][Status ...
- BZOJ 4517: [Sdoi2016]排列计数 错排公式
4517: [Sdoi2016]排列计数 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4517 Description 求有多少种长度为 ...
- Bzoj 4517: [Sdoi2016]排列计数(排列组合)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MB Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ...
- BZOJ.4517.[SDOI2016]排列计数(错位排列 逆元)
题目链接 错位排列\(D_n=(n-1)*(D_{n-1}+D_{n-2})\),表示\(n\)个数都不在其下标位置上的排列数. 那么题目要求的就是\(C_n^m*D_{n-m}\). 阶乘分母部分的 ...
- bzoj 4517: [Sdoi2016]排列计数【容斥原理+组合数学】
第一个一眼就A的容斥题! 这个显然是容斥的经典问题------错排,首先考虑没有固定的情况,设\( D_n \)为\( n \)个数字的错排方案数. \[ D_n=n!-\sum_{t=1}^{n}( ...
- BZOJ 4517: [Sdoi2016]排列计数(组合数学)
题面 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m ...
- BZOJ 4517: [Sdoi2016]排列计数 错排 + 组合
从 $n$ 个数中选 $m$ 个不错排,那就是说 $n-m$ 个数是错排的. 用组合数乘一下就好了. Code: #include <cstdio> #include <algori ...
随机推荐
- Java图形化界面设计——布局管理器之GridBagLayout
GridBagLayout 不会随着窗口的变化标签随之发生变化,可固定. ---------------------------------------------------------- impo ...
- 在winform嵌入外部应用程序
应朋友要求,需要将一个第三方应用程序嵌入到本程序WinForm窗口,以前在VB6时代做过类似的功能,其原理就是利用Windows API中FindWindow函数找到第三方应用程序句柄,再利用SetP ...
- Linux 磁盘分区存放文件和目录的数量 (inode)
文件系统格式centos7缺省是xfs,centos6缺省是ext4,centos5缺省是ext3ext3 文件数最大支持31998个,文件系统容量最大16TB,单个文件最大2TBext4 文件数最大 ...
- Java WebService 教程系列之 Spring 整合 CXF
Java WebService 教程系列之 Spring 整合 CXF 一.引入 jar 包 <dependency> <groupId>org.apache.cxf</ ...
- 2017年值得一看的7个APP设计
新媒体时代蓬勃发展,各类APP如雨后春笋般出现.下载到合适的APP,不仅衣食住行一键搞定,甚至健身.社交.阅读等需求也能足不出户地满足.对于广大“吃瓜群众”来说,选择APP是个人需求以及跟随潮流的选择 ...
- easyjweb ejs 2014.2.25
一 .简单 easyjweb 项目 1. 创建一个web 项目 , 将easyjweb-corejar 包 和required 包下的所有jar 包拷到项目下. 2.写一个 action .. pa ...
- Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8 整合例子
转自:http://www.blogjava.net/wangxinsh55/archive/2011/07/24/354925.html Jbpm4.4+hibernate3.5.4+sprin ...
- 抓包之网络分析器- Wiresshark
https://www.wireshark.org/ Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wi ...
- JavaScript的异步运行机制
----异步运行机制如下: 1.左右同步任务都在主线程上执行,形成一个执行栈 2.主线程值外,还存在一个任务队列,只要异步任务有了运行结果,就在任务队列中放置一个事件 3.一旦执行栈中的所有同步任务执 ...
- 2018.09.11 bzoj47214721: [Noip2016]蚯蚓(单调队列)
传送门 好题. 目测只会多带一个log2(n+m)" role="presentation" style="position: relative;"& ...