BZOJ4714 : 旋转排列
2017-01-31 02:23
99 查看
对于每个$k$,问题等价于求有多少置换满足:
1.存在一个循环长度为$k$
2.任意一个循环长度$\geq 2$
枚举这种环的个数$t$:
设$g_t$表示至少有$kt$个人分成$t$个长度为$k$的循环的方案数,考虑枚举第一个人和哪些人分在了一起,同时有$(k-1)!$种可能的环,有$g_t=C(kt-1,k-1)g_{t-1}(k-1)!$。
设$d_i$表示$i$个人错位排列的方案数,那么至少有$t$个长度为$k$的循环的方案数为$C(n,kt)g_td_{n-kt}$。
考虑容斥,则这部分对答案的贡献为$(-1)^{t-1}C(n,kt)g_td_{n-kt}$。
时间复杂度$O(n\log n)$。
1.存在一个循环长度为$k$
2.任意一个循环长度$\geq 2$
枚举这种环的个数$t$:
设$g_t$表示至少有$kt$个人分成$t$个长度为$k$的循环的方案数,考虑枚举第一个人和哪些人分在了一起,同时有$(k-1)!$种可能的环,有$g_t=C(kt-1,k-1)g_{t-1}(k-1)!$。
设$d_i$表示$i$个人错位排列的方案数,那么至少有$t$个长度为$k$的循环的方案数为$C(n,kt)g_td_{n-kt}$。
考虑容斥,则这部分对答案的贡献为$(-1)^{t-1}C(n,kt)g_td_{n-kt}$。
时间复杂度$O(n\log n)$。
#include<cstdio> const int N=500010,P=1000000007; int n,i,j,k,t,f ,inv ,d ,g ,ans; int main(){ scanf("%d",&n); for(f[0]=i=1;i<=n;i++)f[i]=1LL*f[i-1]*i%P; for(inv[0]=inv[1]=1,i=2;i<=n;i++)inv[i]=1LL*(P-inv[P%i])*(P/i)%P; for(i=1;i<=n;i++)inv[i]=1LL*inv[i-1]*inv[i]%P; for(d[0]=d[2]=1,i=3;i<=n;i++)d[i]=1LL*(i-1)*(d[i-2]+d[i-1])%P; for(i=0;i<=n;i++)d[i]=1LL*d[i]*inv[i]%P; for(g[0]=1,i=2;i<=n;i++)for(j=1,k=i;k<=n;j++,k+=i){ g[j]=1LL*g[j-1]*f[k-1]%P*inv[k-i]%P; t=1LL*inv[k]*d[n-k]%P*g[j]%P; if(j&1){ ans+=t; if(ans>=P)ans-=P; }else{ ans-=t; if(ans<0)ans+=P; } } ans=1LL*ans*f %P; return printf("%d",ans),0; }
相关文章推荐
- 【BZOJ】1072: [SCOI2007]排列perm(状压dp+特殊的技巧)
- 【BZOJ3210】花神的浇花集会 旋转坐标系
- 【bzoj2111】[ZJOI2010]Perm 排列计数 dp+Lucas定理
- BZOJ 1056([HAOI2008]排名系统-Treap旋转概率)
- BZOJ 1072 [SCOI2007]排列perm (状态压缩+dp+同余定理)
- BZOJ 1069 [SCOI2007]最大土地面积 旋转卡壳
- 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳
- [BZOJ2111][ZJOI2010]Perm排列计数(组合数学)
- [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)
- 【BZOJ】4555: [Tjoi2016&Heoi2016]求和 排列组合+多项式求逆 或 斯特林数+NTT
- bzoj2111 [ZJOI2010]Perm 排列计数
- BZOJ 1072 排列perm (状压dp)
- bzoj 4517: [Sdoi2016]排列计数 递推
- [bzoj1072][SCOI2007]排列(状态压缩DP)
- BZOJ 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛|动态规划|排列组合
- 【BZOJ1008】【HNOI2008】越狱(数学排列组合题)
- bzoj 4517: [Sdoi2016]排列计数【容斥原理+组合数学】
- 【bzoj2111】[ZJOI2010]Perm 排列计数
- 产生所有排列---旋转法------2013年1月22日
- BZOJ1072 排列perm [暴搜]