Luogu P4071 [SDOI2016]排列计数
晚上XZTdalao给我推荐了这道数论题。太棒了又可以A一道省选题了
其实这道题也就考一个错排公式+组合数+乘法逆元
我们来一步一步分析
错排公式
通俗的说就是把n个1~n的数排成一个序列A,并使得所有的a[i]!=i(1<=i<=n)
对于这道题我们可以进行转化,要求m个a[i]==i的个数,我们可以把它转化成求(n-m)个a[i]!=i的个数
然后用到错排公式:
d[i]=(i-1)*(d[i-1]+d[i-2])
其中d[i]表示i个数的错排方案
组合数
这个就比较简单了,比较经典的公式
C(m,n)=n!/(m!*(n-m)!)
如果通过组合数的递推公式...等着T死吧
乘法逆元
这个就比较diao了,因为我们知道,模运算对于除法是不适用的
因为你一个很大的数模了以后就突然很小了
所以我们需要引进逆元的概念,你可以简单地把它理解成一个数在模一个数的意义下的倒数,即(x为逆元)
ax≡1(mod p)
但是,p一般都为质数,因此我们可以通过费马小定理来求逆元
费马小定理为:
a^(p-1)≡1(mod p)
所以,我们得到:
a*a^(p-2)≡1(mod p)
因此a的逆元就是a^(p-2)
快速幂求之
所以综合起来这道题就A了
CODE
#include<cstdio>
using namespace std;
typedef long long LL;
const LL N=1000005,mod=1e9+7;
LL d[N],fact[N],t,n,m;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(LL &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline void write(LL x)
{
if (x/10) write(x/10);
putchar(x%10+'0');
}
inline LL quick_pow(LL x,LL p)
{
LL res=1;
while (p)
{
if (p&1) res=1ll*(res*x)%mod;
x=1ll*(x*x)%mod;
p>>=1;
}
return res;
}
inline LL C(LL m,LL n)
{
return (((long long)(fact[n]*quick_pow(fact[m],mod-2))%mod)*quick_pow(fact[n-m],mod-2))%mod;
}
int main()
{
register LL i;
for (fact[0]=fact[1]=1,i=2;i<N;++i)
fact[i]=(LL)(fact[i-1]*i)%mod;
for (d[1]=0,d[0]=d[2]=1,i=3;i<N;++i)
d[i]=(LL)(i-1)*(d[i-1]+d[i-2])%mod;
read(t);
while (t--)
{
read(n); read(m); m=n-m;
write((d[m]*C(m,n))%mod); putchar('\n');
}
return 0;
}
Luogu P4071 [SDOI2016]排列计数的更多相关文章
- 洛谷——P4071 [SDOI2016]排列计数(错排+组合数学)
P4071 [SDOI2016]排列计数 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列 ...
- 洛谷 P4071 [SDOI2016]排列计数 题解
P4071 [SDOI2016]排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳 ...
- 洛谷P4071 [SDOI2016] 排列计数 [组合数学]
题目传送门 排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m ...
- P4071 [SDOI2016]排列计数
题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条 ...
- 洛谷 P4071 [SDOI2016]排列计数
洛谷 这是一道组合数学题. 对于一个长为n的序列,首先我们要选m个使之稳定\(C^{m}_{n}\). 且要保证剩下的序列不稳定,即错排\(D_{n-m}\). 所以答案就是:\[ANS=C^{m}_ ...
- P4071 [SDOI2016]排列计数 题解
分析: 线性求逆元:https://blog.csdn.net/qq_34564984/article/details/52292502 代码: #include<cstdio> usin ...
- 数学【洛谷P4071】 [SDOI2016]排列计数
P4071 [SDOI2016]排列计数 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列 ...
- 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][ ...
随机推荐
- 用AndroidStudio创建so
Android开发中经常遇到so,下面介绍用Android Studio创建so.Android Studio版本3.0.1. 一 编写代码 1 创建java类myJNI.java,并且声明一个nat ...
- Prometheus Node_exporter 之 Network Netstat UDP
Network Netstat UDP /proc/net/snmp 1. UDP In / Out type: GraphUnit: shortLabel: Datagrams out (-) / ...
- 2. DAS,NAS,SAN在数据库存储上的应用
一. 硬盘接口类型1. 并行接口还是串行接口(1) 并行接口,指的是并行传输的接口,比如有0~9十个数字,用10条传输线,那么每根线只需要传输一位数字,即可完成.从理论上看,并行传输效率很高,但是由于 ...
- Oracle EBS FA 资产编号跳号
- [CENTOS7] 将域群组加入到Sudoer里
文章来源:https://derflounder.wordpress.com/2012/12/14/adding-ad-domain-groups-to-etcsudoers/ Adding AD d ...
- ORACLE 查看并修改最大连接数
第一步,在cmd命令行,输入sqlplus,打开登录窗口,如下: 第二步,根据提示输入用户名与密码 请输入用户名:sys as sysdba 输入口令:******** 第三步,查看processes ...
- win10 损坏 bios?
自从前几个月升级为win10后,主板莫名奇妙的就出问题了,遇到3块不同型号2块技嘉b75,1块微信ph67 技嘉b75-ds3v 技嘉b75m-d3v 微星ph67s-c43 ms-7673 1.0 ...
- 复杂json的解析:jsonobject与jsonArray的使用
String parameter = { success : 0, errorMsg : "错误消息", data : { total : "总记录数", ro ...
- 【转】开篇python--明白python文件如何组织,理解建立源文件
在Python 中引用是非常简单的事情,这里需要清楚三个概念就可以了包.模块.类.类这个就不用说了. 模块对应的是一个.py 文件,那么module_name 就是这个文件去掉.py 之后的文件名,p ...
- BZOJ4401:块的计数(乱搞)
Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是 ...