CF341C. Iahub and Permutations [DP 排列]
http://codeforces.com/contest/341/problem/C
题意:
有一个长度为n的排列a,其中有一些位置被替换成了-1。你需要尝试恢
复这个排列,将-1替换回数字。
求有多少种可行的替换方法,满足得到的是一个排列,且不存在ai = i的
位置。n $\le$ 2000
感觉很巧妙的转化:
$n$排列$\rightarrow\ n*n$的棋盘上放$rook$
对角线是不能放的
我们把放了$rook$的行和列删除后,可以发现每列和每行最多一个不能放的位置
$f[i][j]$表示在删除后的棋盘上放了$i$列,有$j$个不能放的位置
$f[i][j]=f[i][j-1]-f[i-1][j-1]\ f[i][0]=i!$
因为$f[i][j-1] \rightarrow f[i][j]$多了一个不能放的位置,对应方案数为$f[i-1][j-1]$
代码这么好写的题$Candy?$因为处理$n,m$,$ll$取模$WA$了三次
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=,INF=1e9+,MOD=1e9+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,k,del[N],a[N];
ll f[N][N];
void dp(){
f[][]=;
for(int i=;i<=n;i++) f[i][]=f[i-][]*i%MOD;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) f[i][j]=(f[i][j-]-f[i-][j-]+MOD)%MOD;
printf("%I64d",f[n][m]);
}
int main(){
//freopen("in","r",stdin);
n=read();m=n;
for(int i=;i<=n;i++){
a[i]=read();
if(a[i]!=-) k++,del[i]=;
}
for(int i=;i<=n;i++){
if(a[i]!=-&&a[a[i]]==-) m--;//printf("look %d %d %d %d\n",i,a[i],del[a[i]],a[a[i]]);;
}
n-=k;m-=k;
//printf("hi %d %d\n",n,m);
dp();
}
CF341C. Iahub and Permutations [DP 排列]的更多相关文章
- cf-341C Iahub and Permutations
C. Iahub and Permutations time limit per test 1 second memory limit per test 256 megabytes input sta ...
- CodeForces 340E Iahub and Permutations 错排dp
Iahub and Permutations 题解: 令 cnt1 为可以没有限制位的填充数字个数. 令 cnt2 为有限制位的填充数字个数. 那么:对于cnt1来说, 他的值是cnt1! 然后我们对 ...
- codeforces 341C Iahub and Permutations(组合数dp)
C. Iahub and Permutations time limit per test 1 second memory limit per test 256 megabytes input sta ...
- codeforces 340E Iahub and Permutations(错排or容斥)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Iahub and Permutations Iahub is so happy ...
- Codeforces Round #198 (Div. 2) E. Iahub and Permutations —— 容斥原理
题目链接:http://codeforces.com/contest/340/problem/E E. Iahub and Permutations time limit per test 1 sec ...
- 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...
- 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...
- 【题解】POJ2279 Mr.Young′s Picture Permutations dp
[题解]POJ2279 Mr.Young′s Picture Permutations dp 钦定从小往大放,然后直接dp. \(dp(t1,t2,t3,t4,t5)\)代表每一行多少人,判断边界就能 ...
- G.subsequence 1(dp + 排列组合)
subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...
随机推荐
- linux命令 uname -r 和 uname -a 的解释与演示
1.uname -r : 显示操作系统的发行版号2.uname -a :显示系统名.节点名称.操作系统的发行版号.内核版本等等. 系统名:Linux 节点名称: iZ2zeeailqvwws5dcui ...
- JXLS 2.4.0系列教程(三)——嵌套循环是怎么做到的
注:本文代码在第一篇文章基础上修改而成,请务必先阅读第一篇文章. http://www.cnblogs.com/foxlee1024/p/7616987.html 本文也不会过多的讲解模板中遍历表达式 ...
- 《SpringMVC从入门到放肆》五、SpringMVC配置式开发(处理器适配器)
上一篇我们大致讲解了处理器映射器的处理流程以及跟了一下源码的执行流程.今天我们来了解一下处理器适配器. 一.适配器模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapt ...
- Python3 的序列
序列 1.根据列表.元组.字符串的共同点把它们统称为序列(他们都是兄弟呀) 1)都可以通过索引来的到每一个元素 2)默认索引值都是从零开始(Python也支持负数索引) 3)都可以通过分片(切片)的方 ...
- 遇到安装app不识别的情况
一般->blokfile->证书设定设置
- Oracle问题之字符集问题,登陆sqlplus出现问号
退出sql SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK show parameter nls_la
- -------- ROOTKIT 核心技术——系统服务调度表挂钩调试(PART III) --------
---------------------------------------------------------------------------------------- 本篇开始进行真枪实弹的 ...
- c# winform 类似android toast消息功能
先看下效果: 支持动画,支持声音,支持定时自动关闭 使用方法: var notifycation = new Notification("My Notification", &qu ...
- git 文件状态与工作区域
在上一篇简单讲述了文件状态与工作区域,在这里结合相关git命令详细了解文件的状态变更. 目录 1. 介绍 2. 常用命令 3. 实际操作 1. 介绍 git的文件状态是其git核心内容,了解后对后续的 ...
- laravel5.5 when()的用法
当你在使用where语句有前提条件时,比如某值为1的时候才执行where子句,否则不执行,这个时候,laravel5.5新出了一个简便方法when($arg,fun1[,fun2]). 具体用法如下: ...