Codeforces Round #198 (Div. 2) E. Iahub and Permutations —— 容斥原理
题目链接:http://codeforces.com/contest/340/problem/E
1 second
256 megabytes
standard input
standard output
Iahub is so happy about inventing bubble sort graphs that he's staying all day long at the office and writing permutations. Iahubina is angry that she is no more important for Iahub. When Iahub goes away, Iahubina comes to his office and sabotage his research
work.
The girl finds an important permutation for the research. The permutation contains n distinct integers a1, a2,
..., an (1 ≤ ai ≤ n).
She replaces some of permutation elements with -1 value as a revenge.
When Iahub finds out his important permutation is broken, he tries to recover it. The only thing he remembers about the permutation is it didn't have any fixed point. A fixed point for a permutation is an element ak which
has value equal to k (ak = k).
Your job is to proof to Iahub that trying to recover it is not a good idea. Output the number of permutations which could be originally Iahub's important permutation, modulo 1000000007 (109 + 7).
The first line contains integer n (2 ≤ n ≤ 2000).
On the second line, there are n integers, representing Iahub's important permutation after Iahubina replaces some values with -1.
It's guaranteed that there are no fixed points in the given permutation. Also, the given sequence contains at least two numbers -1 and each positive number occurs in the sequence at most once. It's guaranteed that there is at least one suitable permutation.
Output a single integer, the number of ways Iahub could recover his permutation, modulo 1000000007 (109 + 7).
5
-1 -1 4 3 -1
2
For the first test example there are two permutations with no fixed points are [2, 5, 4, 3, 1] and [5, 1, 4, 3, 2]. Any other permutation would have at least one fixed point.
题意:
给出大小为n的序列,如果a[i] = k (1<=k<=n),则表明i位置被数字k占领了,如果a[i] = -1,则表明这个数字没有被占领。问:在这种情况下,有多少种错排方式?(题目输入保证有错排)
题解:
1.利用容斥原理计算出非法排列的个数, 非法排列即为至少有一个数是放在原位的, 即a[i] = i。
2.用全排列的个数减去非法排列的个数,即为答案。
容斥原理分析:
1.设m为空位数, k为可以放回原位的个数。
2.枚举可以放回原位的数的个数i,然后再对剩下可放的数进行排列。通式: C(k, i)*A(m-i, m-i):
2.1.当a需要放回原位时(其他有没放回原位不考虑), 那么剩下的数的排列有A(m-1, m-1); 对于 b、c等等, 也如此, 所以总数为C(k,1) * A(m-1, m-1); 根据容斥原理,奇数个时加上。
2.2.当a和b都需要放回原位时(其他有没放回原位不考虑), 那么剩下的数的排列有A(m-2, m-2);对于其他的两两组合也是一样, 所以总数为 C(k,2) * A(m-2, m-2); 根据容斥原理, 偶数个时减去。
2.3. 3个、4个、5个 …… k个。奇数个时加, 偶数个时减。
易错点:
1.凡是带有除法的式子, 都不能直接求模。
2.求模时, 若是加上负数, 需要: ans = (ans + mod)% mod 。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const double eps = 1e-;
const int INF = 2e9;
const LL LNF = 9e18;
const int mod = 1e9+;
const int maxn = 2e3+; bool val[maxn], pos[maxn];
LL C[maxn][maxn], A[maxn]; void init()
{
A[] = ; C[][] = ;
for(int i = ; i<maxn; i++)
{
A[i] = (1LL*i*A[i-])%mod;
C[i][] = ;
for(int j = ; j<=i; j++)
C[i][j] = (C[i-][j-] + C[i-][j])%mod;
}
} int main()
{
init();
int n, m, k;
while(scanf("%d",&n)!=EOF)
{
for(int i = ; i<=n; i++)
{
int x;
scanf("%d",&x);
if(x!=-)
val[x] = pos[i] = ;
} k = m = ;
for(int i = ; i<=n; i++)
{
if(!pos[i]) m++;
if(!pos[i] && !val[i]) k++;
} LL ans = A[m];
for(int i = ; i<=k; i++)
{
LL tmp = (1LL*C[k][i]*A[m-i])%mod;
ans -= (i&)?tmp:-tmp; //容斥原理
ans = (ans+mod)%mod;
}
cout<<ans<<endl;
}
}
Codeforces Round #198 (Div. 2) E. Iahub and Permutations —— 容斥原理的更多相关文章
- Codeforces Round #198 (Div. 1) D. Iahub and Xors 二维树状数组*
D. Iahub and Xors Iahub does not like background stories, so he'll tell you exactly what this prob ...
- Codeforces Round #198 (Div. 2)A,B题解
Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...
- Codeforces Round #485 (Div. 2) E. Petr and Permutations
Codeforces Round #485 (Div. 2) E. Petr and Permutations 题目连接: http://codeforces.com/contest/987/prob ...
- Codeforces Round #198 (Div. 2)
A.The Wall 题意:两个人粉刷墙壁,甲从粉刷标号为x,2x,3x...的小块乙粉刷标号为y,2y,3y...的小块问在某个区间内被重复粉刷的小块的个数. 分析:求出x和y的最小公倍数,然后做一 ...
- Codeforces Round #198 (Div. 2)E题解
E. Iahub and Permutations Iahub is so happy about inventing bubble sort graphs that he's staying all ...
- Codeforces Round #198 (Div. 1 + Div. 2)
A. The Wall 求下gcd即可. B. Maximal Area Quadrilateral 枚举对角线,根据叉积判断顺.逆时针方向构成的最大面积. 由于点坐标绝对值不超过1000,用int比 ...
- Codeforces Round #198 (Div. 2) D. Bubble Sort Graph (转化为最长非降子序列)
D. Bubble Sort Graph time limit per test 1 second memory limit per test 256 megabytes input standard ...
- [置顶] Codeforces Round #198 (Div. 1)(A,B,C,D)
http://codeforces.com/contest/341 赛后做的虚拟比赛,40分钟出了3题,RP爆发. A计数问题 我们可以对每对分析,分别对每对<a, b>(a走到b)进行统 ...
- Codeforces Round #198 (Div. 2) 340C
C. Tourist Problem time limit per test 1 second memory limit per test 256 megabytes input standard i ...
随机推荐
- pycharm上传代码到码云(详细)
如要转载 麻烦请您备注好原文出处!!!!(谢谢合作!) >>首先要去码云注册个账号 提示(尽量使用英文名)创建用户名 使用邮箱登录 >>然后创建库 >填写项目的基础信息 ...
- 洛谷—— P2251 质量检测
https://www.luogu.org/problemnew/show/P2251 题目背景 无 题目描述 为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后 ...
- bzero和memset
一. bzero和memset函数 1. bzero已不建议使用 原型:extern void bzero(void *s, int n); 2.memset void *memset(void *s ...
- POJ 3107 Godfather (树重心)
题目链接:http://poj.org/problem?id=3107 题意: 数重心,并按从小到大输出. 思路: dfs #include <iostream> #include < ...
- HDU 4081 Qin Shi Huang's National Road System 最小生成树+倍增求LCA
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 Qin Shi Huang's National Road System Time Limit: ...
- SpringBoot中@EnableAutoConfiguration注解用法收集
参考: http://blog.csdn.net/xiaoyu411502/article/details/52770723 https://docs.spring.io/spring-boot/do ...
- Node之父ry发布新项目deno:下一代Node
https://mp.weixin.qq.com/s/1LcO3EqGV2iRlZ1aIrQeqw
- SilverLight:布局(3)StackPanel 对象
ylbtech-SilverLight-Layout: 布局(3)StackPanel 对象 A, Nesting Layout Containers(内嵌布局容器) B, StackPanel(队列 ...
- Toolbar的使用.md
1.什么是Toolbar Toolbar是在Android5.0时出现的一个新控件,其目的用于取代Actionbar,它与Actionbar最大的差别就是Toolbar使用更加灵活.自由,而且Tool ...
- java 发送微信客服消息
package com.baosight.wechat.service; import net.sf.json.JSONObject; import org.apache.commons.httpcl ...