BZOJ 4517 浅谈错位排列组合计数
2017-10-23 21:51
417 查看
世界真的很大
讲道理本来5分钟的水题卡了我半个小时一直RE
原因竟是因为cout?
改成printf就对了??EXM?
看题先:
description:
求有多少种长度为 n 的序列 A,满足以下条件:1 ~ n 这 n 个数在序列中各出现了一次
若第 i 个数 A[i] 的值为 i,则称 i 是稳定的。序列恰好有 m 个数是稳定的
满足条件的序列可能很多,序列数对 10^9+7 取模。
input:
第一行一个数 T,表示有 T 组数据。接下来 T 行,每行两个整数 n、m。
T=500000,n≤1000000,m≤1000000
output:
输出 T 行,每行一个数,表示求出的序列数题目要求有m个数稳定,那么肯定是先枚举这m个数:C(n,m)
然后剩下的n-m个数不能在自己原先站的位置,只看顺序的话就是错排:
fi= (i-1) *(fi-1 +fi-2)
O(n)预处理错排,阶乘,阶乘的逆元
O(1)求解
不是我题解水,是真的只有这么一点了。。
完整代码:
#include<stdio.h> #include<iostream> using namespace std; typedef long long dnt; const dnt mod=1e9+7; int n,m,T; dnt f[4000010],saber[4000010],inv[2000010]; void init(int N) { f[0]=1,f[1]=0,f[2]=1,saber[0]=1,inv[0]=inv[1]=1; for(int i=3;i<=N;i++) f[i]=(i-1)*((f[i-1]+f[i-2])%mod)%mod; for(int i=1;i<=N;i++) saber[i]=saber[i-1]*i%mod; for(int i=2;i<=N;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod; for(int i=1;i<=N;i++) inv[i]=inv[i]*inv[i-1]%mod; } dnt Misaka(int a,int b) { if(a<b) return 0; return saber[a]*inv[b]%mod*inv[a-b]%mod; } int main() { init(2000000); scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); printf("%lld\n",Misaka(n,m) * f[n-m] %mod); } return 0; } /* Whoso pulleth out this sword from this stone and anvil is duly bor nKing of all England */
嗯,就是这样
相关文章推荐
- BZOJ.4517.[SDOI2016]排列计数(错位排列 逆元)
- bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)
- BZOJ 4517: [Sdoi2016]排列计数 组合数 错排公式
- BZOJ_4517_[Sdoi2016]排列计数_组合数学
- bzoj 4517: [Sdoi2016]排列计数 排列组合+动态规划
- 【BZOJ 4517】排列计数 - 排列组合+乘法逆元
- [组合 错排] BZOJ 4517 [Sdoi2016]排列计数
- BZOJ 4517|SDOI 2016|排列计数|错排公式|组合数学
- 【BZOJ1008】越狱(排列组合计数,容斥原理)
- BZOJ 4517: [Sdoi2016]排列计数 错排公式
- BZOJ 4517 排列计数
- BZOJ 2111 ZJOI2010 Perm 排列计数 组合数学+Lucas定理
- BZOJ 2111: [ZJOI2010]Perm 排列计数(简单组合数学)
- BZOJ 4517 [Sdoi2016]排列计数 数论
- [bzoj2111][ZJOI2010]Perm 排列计数(组合数学)
- bzoj 2111: [ZJOI2010]Perm 排列计数 (组合数学+Lucas定理)
- BZOJ 2111: [ZJOI2010]Perm 排列计数|组合数学|Lucas定理|DP
- BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]
- bzoj 4517: [Sdoi2016]排列计数(错排+组合数逆元)
- 【BZOJ-2839】集合计数 容斥原理 + 线性推逆元 + 排列组合