[HAOI 2011]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
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的更多相关文章
- [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[ ...
- [HAOI 2011] Problem A
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2298 [算法] 考虑用总人数 - 最多人说真话 显然 , 对于每个人 , 如果他说的 ...
- [HAOI 2011]Problem b
Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...
- [BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)
[BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), ...
- 【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( ...
- 数学(莫比乌斯反演):HAOI 2011 问题B
题目描述: 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入格式: 第一行一个整数n,接下来n ...
- [HAOI 2011]向量
Description 题库链接 给你一对数 \(a,b\) ,你可以任意使用 \((a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b ...
- HDU 2011 多项式求和
http://acm.hdu.edu.cn/showproblem.php?pid=2011 Problem Description 多项式的描述如下:1 - 1/2 + 1/3 - 1/4 + 1/ ...
- 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 ...
随机推荐
- ReentrantLock 与 AQS 源码分析
ReentrantLock 与 AQS 源码分析 1. 基本结构 重入锁 ReetrantLock,JDK 1.5新增的类,作用与synchronized关键字相当,但比synchronized ...
- oracle导出dmp文件的2种方法
使用exp和expdp导出数据 1.exp导出数据命令 exp gd_base/@192.168.13.211/oanet file=D:\export\gd_base.dmp log=D:\expo ...
- 2017-2018-1 Java演绎法 小组成员贡献量汇总
[第一周]贡献量(31) [说明] 完成情况 是指 每次是否全部完成分配的任务,如果全部完成贡献量记为1,否则记为0,与贡献量(时间量)相加计算贡献比例,由于前十周有具体的任务分配,Alpha阶段(第 ...
- 理解Python迭代对象、迭代器、生成器
作者:zhijun liu链接:https://zhuanlan.zhihu.com/p/24376869来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本文源自RQ作 ...
- 在arc模式下 CGImage 释放问题
//大图bigImage //定义myImageRect,截图的区域 if (imagecount >= 3) { CGRect myImageRect; if (i.size.width< ...
- idea找不到package下的mapper.xml文件
由于开发人员使用不同的开发工具,导致eclipse的开发人员将mapper.xml文件习惯性的放到package下,以便查看,而eclipse编译时,不会忽略package下的xml以及dtl文件,所 ...
- 基于python的统计公报关键数据爬取 update
由于之前存在的难以辨别市本级,全市相关数据的原因,经过考虑采用 把含有关键词的字段全部提取进行人工辨别的方法 在其余部分不改变的情况下,更改test部分 def test(real_Title,rea ...
- Mego开发文档 - 从EF6/EFCore迁移到Mego
从EF6/EFCore迁移到Mego框架 如果您有EntityFragmework6或EntityFragmeworkCore的开发经验,在首次接触Mego框架时会发现这两个框架非常相似,本文将帮忙您 ...
- win7远程桌面 连接不上(用户名与全名不匹配的问题)
用户名与用户全名不一致导致的.我刚也是这个问题,折腾够了好久.你先看看 计算机右键→管理→本地用户和组→用户 找到你需要远程的管理员账户,看看名称与全名是否一致,若不一致,继续看下面.1.按" ...
- 工作笔记 | Visual Studio 调用 Web Service
引言 最近笔者负责ERP财务系统跟中粮集团财务公司的财务系统做对接,鉴于ERP系统中应付结算单结算量比较大,而且管理相对集中,ERP系统与中粮财务公司的支付平台系统对接,实现银企直联,将网银录入的环节 ...