bzoj4517: [Sdoi2016]排列计数
来源:互联网 发布:复制淘宝店铺首页装修 编辑:程序博客网 时间:2024/05/27 21:49
链接
http://www.lydsy.com/JudgeOnline/problem.php?id=4517
题解
错排问题是这道题首先要解决的。
设i个元素的错排方案数是f[i],那么f[i]=(i-1)(f[i-1]+f[i-2])。
考虑加入第i个元素,先枚举这个元素放在哪里,枚举j∈[1,i-1],那么j这个数就有两种情况,第一种,放在i的位置上,那么剩下的就成了i-2个元素的错排问题。第二种,不放在i这个位置上,那么i这个位置就可以看作是j不能放在的地方,i-1个元素又各自有一个不能放的地方了,所以就是i-1个元素的错排问题。所以f[i]=(i-1)(f[i-1]+f[i-2])。初始f[0]=1,f[1]=0;
对于这道题目,首先选出m个元素让他们在位,剩下的就成了错排问题。因此ans=C(n,m)*f[n-m]。
代码
//排列组合#include <cstdio>#include <algorithm>#define maxn 1500000#define p 1000000007#define ll long longusing namespace std;ll f[maxn], fac[maxn];inline void exgcd(ll a, ll b, ll &x, ll &y){ll xx, yy;if(!b){x=1,y=0;return;}exgcd(b,a%b,xx,yy);x=yy, y=xx-a/b*yy;}inline ll inv(ll x){ll xx, yy;exgcd(x,p,xx,yy);return (xx+p)%p;}void init(){ll i;fac[0]=1;for(i=1;i<=1000000;i++)fac[i]=i*fac[i-1]%p;f[0]=1;f[1]=0;f[2]=1;for(i=3;i<=1000000;i++)f[i]=(i-1)*(f[i-1]+f[i-2])%p;}ll C(ll n, ll m){return fac[n]*inv(fac[n-m]*fac[m]%p)%p;}int main(){ll T, n, m;init();scanf("%lld",&T);while(T--){scanf("%lld%lld",&n,&m);printf("%lld\n",C(n,m)*f[n-m]%p);}return 0;}
0 0
- [bzoj4517][SDOI2016]排列计数
- bzoj4517: [Sdoi2016]排列计数
- BZOJ4517 [Sdoi2016]排列计数
- bzoj4517【SDOI2016】排列计数
- 【bzoj4517】【SDOI2016】排列计数
- bzoj4517: [Sdoi2016]排列计数
- BZOJ4517: [Sdoi2016]排列计数
- bzoj4517: [Sdoi2016]排列计数
- bzoj4517 [Sdoi2016]排列计数
- BZOJ4517 [Sdoi2016][排列计数]
- BZOJ4517——[Sdoi2016]排列计数
- bzoj4517 sdoi2016 排列计数 错排
- [bzoj4517][Sdoi2016]排列计数(组合数学)
- [BZOJ4517][SDOI2016]排列计数(排列组合)
- 【BZOJ4517】【Sdoi2016】排列计数 线性逆元 错位排列
- [BZOJ4517][Sdoi2016]排列计数(错排+组合数)
- [BZOJ4517][Sdoi2016]排列计数(组合数+逆元)
- [bzoj4517][Sdoi2016]排列计数 组合数+逆元
- 【C语言简单说】四:常量
- 单机版Rabbitmq集群搭建
- Matlab textread函数详解
- 防止sql注入的方法
- MemCache缓存雪崩现象
- bzoj4517: [Sdoi2016]排列计数
- elasticsearch集群一键部署安装
- 小程序开发有哪些坑
- 【bzoj1257】[CQOI2007]余数之和sum
- 用c语言实现进度条
- 微信小程序-开发经验总结---(基础重点)
- 错误1:关于函数内访问与修改全局变量,报错代码:UnboundLocalError: local variable 'l' referenced before assignment
- hdu2063(二分匹配基础)
- 如何将自己的文件上传至github-从注册账号说起