[BZOJ2392][HAOI2011]Problem c
Description
Input
第一行一个整数T,表示数据组数
对于每组数据,第一行有三个整数,分别表示n、m、M
若m不为0,则接下来一行有m对整数,p1、q1,p2、q2 ,…, pm、qm,其中第i对整数pi、qi表示第pi个人的编号必须为qi
Output
对于每组数据输出一行,若是有解则输出YES,后跟一个整数表示方案数mod M,注意,YES和数之间只有一个空格,否则输出NO
Sample Input
4 3 10
1 2 2 1 3 1
10 3 8882
7 9 2 9 5 10
Sample Output
YES 4
NO
HINT
100%的数据满足:1≤T≤10,1≤n≤300,0≤m≤n,2≤M≤109,1≤pi、qi≤n 且保证pi互不相同。
还是考虑关于一个排列的的计数问题有两种基本的思路,一是考虑一个元素放在哪一个位置,二是考虑一个位置可以放哪些元素。
对于这道题用第二种思路比较好解决。
我们发现,问题有解的必要条件是在第$i$个位置,可以在$i$及之前放置的人的个数大于等于$i$。
所以我们维护前缀和$sum[i]$表示编号确定在$i$之前的人的个数,特别的如果一个人没有确定的编号,那么它的最小编号就是0,所以$sum[0]=n-m$。
设$cnt[i]$为编号必须是i的人的个数。
然后设$f[i][j]$表示前$i$个位置,已经安排完了$j$个人的方案数,显然$j>i$。
那么我们转移就是枚举$i$这个位置放$k$个人然后$f[i][j] = f[i][j]+f[i-1][j-k] \times C(sum[i]-(j-k)-cnt[i], k-cnt[i])$。
意思就是刨去必须在这个位置上选的数。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define reg register
inline int read() {
int res = ;char ch=getchar();bool fu=;
while(!isdigit(ch))fu|=(ch=='-'),ch=getchar();
while(isdigit(ch))res=(res<<)+(res<<)+(ch^), ch=getchar();
return fu?-res:res;
}
#define ll long long
int n, m, mod;
ll C[][];
ll f[][], cnt[], sum[];
bool ok; int main()
{
int T = read();
while(T--)
{
n = read(), m = read(), mod = read();
memset(f, , sizeof f), memset(C, , sizeof C);
memset(cnt, , sizeof cnt), memset(sum, , sizeof sum);
ok = ;
C[][] = ;
for (reg int i = ; i <= n ; i ++)
{
C[i][] = ;
for (reg int j = ; j <= i ; j ++) C[i][j] = (C[i - ][j] + C[i - ][j - ]) % mod;
}
for (reg int i = ; i <= m ; i ++) read(), cnt[read()]++;
sum[] = n - m;
for (reg int i = ; i <= n ; i ++) sum[i] = sum[i - ] + cnt[i];
for (reg int i = ; i <= n ; i ++) if (sum[i] < i) {ok = ;break;}
if (!ok) {puts("NO");continue;}
f[][] = ;
for (reg int i = ; i <= n ; i ++)
for (reg int j = i ; j <= sum[i] ; j ++)
for (reg int k = cnt[i] ; j - k >= i - ; k ++)
f[i][j] = (f[i][j] + f[i - ][j - k] * C[sum[i] - (j - k) - cnt[i]][k - cnt[i]]) % mod;
printf("YES %lld\n", f[n][n]);
}
return ;
}
[BZOJ2392][HAOI2011]Problem c的更多相关文章
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4032 Solved: 1817[Submit] ...
- bzoj 2301: [HAOI2011]Problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 3757 Solved: 1671 [Submit] ...
- HAOI2011 problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 1047 Solved: 434[Submit][ ...
- BZOJ 2298: [HAOI2011]problem a 动态规划
2298: [HAOI2011]problem a Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnli ...
- BZOJ 2301: [HAOI2011]Problem b 莫比乌斯反演
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 1007 Solved: 415[Submit][ ...
- 2301: [HAOI2011]Problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4164 Solved: 1888[Submit] ...
- BZOJ 2302: [HAOI2011]Problem c( dp )
dp(i, j)表示从i~N中为j个人选定的方案数, 状态转移就考虑选多少人为i编号, 然后从i+1的方案数算过来就可以了. 时间复杂度O(TN^2) ------------------------ ...
- BZOJ 2301: [HAOI2011]Problem b( 数论 )
和POI某道题是一样的... http://www.cnblogs.com/JSZX11556/p/4686674.html 只需要二维差分一下就行了. 时间复杂度O(MAXN + N^1.5) - ...
- 2301: [HAOI2011]Problem b ( 分块+莫比乌斯反演+容斥)
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 6015 Solved: 2741[Submit] ...
随机推荐
- Winform中使用DevExpress时给控件添加子控件的方法
场景 在WInform中使用DevExpress时经常使用PanelControl控件用来进行布局设计,因此需要在代码中生成控件并添加子控件. 实现 一种是设置要添加的自控件的Parent属性为容器控 ...
- 分别设计点类Point和圆类Circle,点类有两个私有数据纵坐标和横坐标;圆类有也两个私有数据圆心和半径,其中圆心是一个点类对象;要求如下所述: (1) 通过构造方法初始化数据成员,数据成员的初始化通过构造方法的参数传递;(2) 分别编写点和圆的输出函数,其中圆的输出包括圆心和半径的输出;点的输出x,y;
题目相对简单: package naizi; public class Circle { //私有成员及构造方法 private Point center; private int r; Circle ...
- Jenkins 持续集成安装及使用简介
博客地址:http://www.moonxy.com 一.前言 持续集成(Continuous integration,简称CI)指的是,频繁地(一天多次)将代码集成到主干. 持续集成的目的,就是让产 ...
- Failed to access IIS metabase.
framework4.0 可这样 C:\Inetpub\AdminScripts>cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\ C:\WIN ...
- [Pandas] 04 - Efficient I/O
SQLITE3接口 调动 SQLITE3数据库 import sqlite3 as sq3 query = 'CREATE TABLE numbs (Date date, No1 real, No2 ...
- 对象实例Vue
var vm = new Vue({ el:'#app', data:{}, //数据 methods:{}, //方法调用 filters:{}, //私有过滤器 directives:{}, // ...
- Ubuntu su命令 Authentication failure的解决办法
重新设置root的密码: $ sudo passwd root Enter new UNIX password: Retype new UNIX password: passwd: password ...
- 阿里云ESC服务器centos6.9使用及注意事项
阿里云ESC服务器,配置低,但是足够新手尝试操作练习. 使用之前,注意事项: 选择操作系统 设置实例快照 安装终端工具 一,选择操作系统. 可以在购买服务器的时候进行选择系统盘,也可以在购买之后在实例 ...
- Spring Boot(四) Mybatis-MySql
Spring Boot(四) Mybatis-MySql 0.准备数据库表 -- ---------------------------- -- Table structure for person ...
- 手动模拟JDK动态代理
为哪些方法代理? 实现自己动态代理,首先需要关注的点就是,代理对象需要为哪些方法代理? 原生JDK的动态代理的实现是往上抽象出一层接口,让目标对象和代理对象都实现这个接口,怎么把接口的信息告诉jdk原 ...