Description

给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1,ai+1也被占据了的话就尝试ai+2,……,如果一直尝试到第n个都不行,该安排方案就不合法。然而有m个人的编号已经确定(他们或许贿赂了你的上司...),你只能安排剩下的人的编号,求有多少种合法的安排方案。由于答案可能很大,只需输出其除以M后的余数即可。

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

2
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$个。有些人钦定了座位。问合法序列多少个。

题解

难道就我一个人纠结题意纠结这么久么??

令$f_{i,j}$表示编号$≤i$的人有$j$个的方案数,$cnt_i$表示确定编号为$i$的人的个数,$sum_i$表示编号可以$≤i$的人的个数。

则:$$f_{i,j}=\sum_{k=cnt_i}^{j-i+1}f_{i-1,j-k}*C_{sum_i-cnt_i-(j-k)}^{k-cnt_i}$$

显然$i<=j$,那么我们可以考虑如何从$i-1$转移到$i$。因为是从$i-1$转移过来,那么显然我们需要知道编号确定为$i$的人究竟有多少个。所以我们可以枚举这一位,也就是$i$,编号恰好为$i$的人数$k$。那么这个人数$k$显然最少为$cnt[i]$,也就是编号必须为$i$的人数,另外我们需要知道小于等于$i$的人有$j$个,所以同样需要枚举。$j$的范围是$i$到$sum[i]$(最多为$sum[i]$,相当于是能选编号小于等于$i$的最大人数)。所以上一位一共选了$j-k$个人(这一位新选了$k$个(注意:$k≤j-i+1$,因为上一位最少选$i-1$个),一共是$j$个人),所以就可以从$f_{i-1,j-k}$转移过来。那么这一位一共要选出$k-cnt[i]$个人编号为$i$,因为$cnt[i]$是必须要编号为$i$的人数,所以剩下的才是可供自由支配的。然后总人数呢?就是$sum[i]-(j-k)$也就是说这一位最多选$sum[i]$,上一位选了$(j-k)$,可知这一位最多选$sum[i]-cnt[i]-j+k$个人,也就是可以自由支配的总数。所以只需要把上一位的方案数$f_{i-1,j-k}$乘上一个组合数就可以得到这次的$f_{i,j}$。所以我们要预处理一下组合数。记得取模!

 //It is made by Awson on 2017.10.19
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Abs(x) ((x) < 0 ? (-(x)) : (x))
using namespace std;
const int N = ; int C[N+][N+];
int n, m, M, p, q;
int cnt[N+], sum[N+];
int f[N+][N+]; void work() {
scanf("%d%d%d", &n, &m, &M);
memset(cnt, , sizeof(cnt)); memset(f, , sizeof(f));
for (int i = ; i <= n; i++) {
C[i][] = ;
for (int j = ; j <= i; j++) C[i][j] = (C[i-][j-]+C[i-][j])%M;
}
for (int i = ; i <= m; i++) {
scanf("%d%d", &p, &q); cnt[q]++;
}
sum[] = n-m;
for (int i = ; i <= n; i++) {
sum[i] = sum[i-]+cnt[i];
if (sum[i] < i) {
printf("NO\n"); return;
}
}
printf("YES ");
f[][] = ;
for (int i = ; i <= n; i++)
for (int j = i; j <= sum[i]; j++)
for (int k = cnt[i]; k <= j-i+; k++)
(f[i][j] += (LL)f[i-][j-k]*C[sum[i]-cnt[i]-(j-k)][k-cnt[i]]%M) %= M;
printf("%d\n", f[n][n]);
}
int main() {
int t; cin >> t;
while (t--) work();
return ;
}

[HAOI 2011]Problem c的更多相关文章

  1. [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)

    [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明) 题面 T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[ ...

  2. [HAOI 2011] Problem A

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2298 [算法] 考虑用总人数 - 最多人说真话 显然 , 对于每个人 , 如果他说的 ...

  3. [HAOI 2011]Problem b

    Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

  4. [BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)

    [BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), ...

  5. 【BZOJ 2301】【HAOI 2011】Problem b

    今天才知道莫比乌斯反演还可以这样:$$F(n)=\sum_{n|d}f(d) \Rightarrow f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d)$$我好弱,,,对于$$F( ...

  6. 数学(莫比乌斯反演):HAOI 2011 问题B

    题目描述: 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入格式: 第一行一个整数n,接下来n ...

  7. [HAOI 2011]向量

    Description 题库链接 给你一对数 \(a,b\) ,你可以任意使用 \((a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b ...

  8. HDU 2011 多项式求和

    http://acm.hdu.edu.cn/showproblem.php?pid=2011 Problem Description 多项式的描述如下:1 - 1/2 + 1/3 - 1/4 + 1/ ...

  9. Warsaw U Contest Petrozavo dsk Summer 2011 Training Camp, Monday, September 5, 2011

    Warsaw U Contest Petrozavo dsk Summer 2011 Training Camp, Monday, September 5, 2011 Problem A.Chocol ...

随机推荐

  1. 软工实践项目需求分析(团队)修改版get√-黄紫仪

    日常前言:随笔距离文档大体完成已经过去了2天+(因为中间插了一波结对作业),所以目测感受没有那时候清晰(那时候烦的想打人了都--)需求分析那边去百度找了模板.emmmm好多东西感觉听都没听说过QAQ, ...

  2. Alpha冲刺No.10

    一.站立式会议 我们的阿尔法冲刺也基本宣告血崩,虽然很多功能已经实现,但是并没有串联在一起,好在这周不需要上课,我们也能好好睡一觉 实现手机的定位系统 细化界面设计 解决数据库和软件交互的一些问题 二 ...

  3. 项目Beta冲刺Day6

    项目进展 李明皇 今天解决的进度 进行前后端联动调试 明天安排 完善程序运行逻辑 林翔 今天解决的进度 服务器端发布消息,删除消息,检索消息,个人发布的action 明天安排 图片功能遇到问题,微信小 ...

  4. 在Apache中运行Python WSGI应用

    我们介绍如何使用Apache模块mod_wsgi来运行Python WSGI应用. 安装mod_wsgi 我们假设你已经有了Apache和Python环境,在Linux或者Mac上,那第一步自然是安装 ...

  5. jvm垃圾收集器总结jdk1.7

    内存 ● 线程私有:程序计数器,虚拟机栈,本地方法栈 ● 线程共享: 方法区,堆 判断存活算法 ● 引用计数法:无法解决循环引用问题. ● 可达性分析算法: 从GCRoot作为起始点,向下搜索,经过的 ...

  6. nyoj 韩信点兵

    描述相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入3个非负整数a,b,c ,表示每种队形排尾的人数 ...

  7. JAVA_SE基础——3.Java程序的开发流程

    上一篇,写的是JAVA的环境变量的配置,今天我抽空写篇Java程序的开发流程,下面的教程是我结合书本和毕向东老师的视频写下的心的~ 在没有真正写Java程序前,首先需要了解Java程序的开发过程. S ...

  8. Spring源码情操陶冶#task:scheduled-tasks解析器

    承接前文Spring源码情操陶冶#task:executor解析器,在前文基础上解析我们常用的spring中的定时任务的节点配置.备注:此文建立在spring的4.2.3.RELEASE版本 附例 S ...

  9. iot:下一步要做的工作

    1.DeviceMessage抽象(定义&支持扩展)2.createDeviceMessage.analyseDeviceMessage(支持扩展)3.日志打印4.错误处理5.断线重连6.交互 ...

  10. 新概念英语(1-143)A walk through the woods

    Lesson 143 A walk through the woods 林中散步 Listen to the tape then answer this question. What was so f ...