cf 341C (容斥原理)
来源:互联网 发布:中日海军对比2017知乎 编辑:程序博客网 时间:2024/06/01 09:25
http://codeforces.com/contest/341/problem/C
首先肯定是处理那些没有确定的位置,作为集合S,大小为m。
对于没有用过的数,有的是出现在S中,有的没有。
设出现在S中的数量为same,则就是总的方案数(m!)-不合法的方案数(至少有一个重合的方案,至少有两个。。。)
这个可以用容斥原理来解决
#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;const int N=2005;typedef long long ll;const ll mod=1e9+7;int n,m;int a[N],q1[N],q2[N];ll jc[N],ny[N];ll C(int m,int n){return jc[n]*ny[m]%mod*ny[n-m]%mod; }bool b[N];int main(){scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&a[i]);if (a[i]==-1) continue;if (a[i]==i){printf("0");return 0;}b[a[i]]=true;}int same=0;for (int i=1;i<=n;i++) if (a[i]==-1&&!b[i]) same++; ll ans=0;jc[0]=1;for (int i=1;i<=n;i++) jc[i]=jc[i-1]*i%mod;ny[0]=ny[1]=1;for (int i=2;i<=n;i++) ny[i]=ny[mod%i]*(mod-mod/i)%mod;for (int i=1;i<=n;i++) ny[i]=ny[i-1]*ny[i]%mod;for (int i=0;i<=same;i++) {ll tmp=C(i,same)*jc[m-i]%mod;if (i&1) ans=((ans-tmp)%mod+mod)%mod;else ans=(ans+tmp)%mod;}printf("%I64d",ans%mod);return 0;}
总结
1:也证明,容斥原理不一定非要集合二进制枚举也有线性的容斥
0 0
- cf 341C (容斥原理)
- cf 547C 容斥原理
- CF 547 C Mike and Foam(容斥原理)
- CF 305 div2 E. Mike and Foam (容斥原理)
- CF GYM 100548 容斥原理+快速幂+逆元
- cf/Codeforces Gym 100548F Color (容斥原理)
- CF 803 F Coprime Subsequences (容斥原理)
- codeforces 547C 容斥原理
- CF 803 F. Coprime Subsequences(数论题,莫比乌斯,容斥原理)
- CF 900D Unusual Sequence 容斥
- hdu5072 Coprime | 2014鞍山赛区C题 | 容斥原理
- Mike and Foam - CodeForces #547 C 容斥原理
- Codeforces Round #305 (Div. 1) C(容斥原理)
- 【CodeForces】651C - Watchmen(排序,容斥原理)
- 容斥原理
- 容斥原理 POJ3904
- 【容斥原理】八
- 【八】容斥原理
- 增强学习系列之(一):增强学习介绍
- 共同学习Java源代码-数据结构-TreeSet(一)
- 策略模式和Spring的结合在项目中的应用
- 371. Sum of Two Integers
- Codeforces 681C Heap Operation 【模拟】【堆】
- cf 341C (容斥原理)
- Win10 独立音量调整
- 3.1入门模拟B1008. 数组元素循环右移问题 (20)
- Javascript异步编程的4种方法
- 机器学习基础 第六章 模型选择
- 为什么要重写hashcode() 方法
- java.io.Serializable浅析
- Hibernate复合主键映射
- activiti工作流的web流程设计器整合视频教程 SSM和独立部署