题目链接:http://codeforces.com/contest/340/problem/E

E. Iahub and Permutations
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

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).

Input

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

Output a single integer, the number of ways Iahub could recover his permutation, modulo 1000000007 (109 + 7).

Examples
input
5
-1 -1 4 3 -1
output
2
Note

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 —— 容斥原理的更多相关文章

  1. 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 ...

  2. Codeforces Round #198 (Div. 2)A,B题解

    Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...

  3. Codeforces Round #485 (Div. 2) E. Petr and Permutations

    Codeforces Round #485 (Div. 2) E. Petr and Permutations 题目连接: http://codeforces.com/contest/987/prob ...

  4. Codeforces Round #198 (Div. 2)

    A.The Wall 题意:两个人粉刷墙壁,甲从粉刷标号为x,2x,3x...的小块乙粉刷标号为y,2y,3y...的小块问在某个区间内被重复粉刷的小块的个数. 分析:求出x和y的最小公倍数,然后做一 ...

  5. Codeforces Round #198 (Div. 2)E题解

    E. Iahub and Permutations Iahub is so happy about inventing bubble sort graphs that he's staying all ...

  6. Codeforces Round #198 (Div. 1 + Div. 2)

    A. The Wall 求下gcd即可. B. Maximal Area Quadrilateral 枚举对角线,根据叉积判断顺.逆时针方向构成的最大面积. 由于点坐标绝对值不超过1000,用int比 ...

  7. 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 ...

  8. [置顶] Codeforces Round #198 (Div. 1)(A,B,C,D)

    http://codeforces.com/contest/341 赛后做的虚拟比赛,40分钟出了3题,RP爆发. A计数问题 我们可以对每对分析,分别对每对<a, b>(a走到b)进行统 ...

  9. Codeforces Round #198 (Div. 2) 340C

    C. Tourist Problem time limit per test 1 second memory limit per test 256 megabytes input standard i ...

随机推荐

  1. 分享Kali Linux 2017年第11周镜像文件

     分享Kali Linux 2017年第11周镜像文件 Kali?Linux官方于3月12日发布2017年的第11周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KDE ...

  2. 安装部署k8s-版本-1.13

    1.环境准备 # 统一hosts cat /etc/hosts 10.0.0.10 k8s-master 10.0.0.20 k8s-node1 10.0.0.30 k8s-node2 # 同步时间 ...

  3. luogu P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...

  4. java常用IO

    字节流:FileInputStream.FileOutputStream 字符流:FileWriter.FileReader 转换流:InputStreamReader.OutputStreamRea ...

  5. GDKOI賽前總結

    @(賽前總結)[GDKOI2017] 提一些比賽時要注意的事項: 賽前先把讀入優化/輸出優化的模板調試好, 加入缺省源中. 注意不要出錯, 輸出為0或者負數的情況要特盤; 讀入輸出文件名不要搞錯; 由 ...

  6. iOS -- app全局字体设置

    方法一: 写一个UILabel(FontExtension)扩展重写initWithFrame(手写代码必走方法)和awakeFromNib(xib必走方法)当然UIButton.UITextView ...

  7. 第九讲_图像生成 Image Captioning

    第九讲_图像生成 Image Captioning 生成式对抗网络 Generative Adversarial network 学习数据分布:概率密度函数估计+数据样本生成 生成式模型是共生关系,判 ...

  8. 移动端底部input被弹出的键盘遮挡

    https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollIntoView 移动端input被键盘遮挡,事件是跳到可视区域! doc ...

  9. Ubuntu下安装libsvm

    在安装LibSVM前需要先装 python 和 gnuplot linux 一般都自带了python2.7,所以python的安装不再赘述 在 ubuntu 下安装 gnuplot 不能直接 sudo ...

  10. MGTemplateEngine 模版发动机简单使用

    https://github.com/nxtbgthng/MGTemplateEngine MGTemplateEngine 模版引擎 MGTemplateEngine比較象 PHP 中的 Smart ...