传送门

先考虑如何判断无解,设 $sum[i]$ 表示确定的人中,编号大于 $i$ 的人的人数

如果 $sum[i]>n-i+1$ 则无解,进一步考虑设 $f[i][j]$ 表示当前确定完编号大于等于 $i$ 的人,除去原本固定的人还有 $j$ 人已经确定

那么有 $f[i][j]=\sum_{k=0}^{j}f[i+1][j-k] \cdot C_{j}^{k},j \in [0,n-i+1-sum[i]]$

表示在确定 $j-k$ 人的编号的情况下,再选 $k$ 个人编号为 $i$,乘上组合数是因为每个人都是不同的,我们可以在 $j$ 个人中任意选择 $k$ 个编号为 $i$

记得组合数每次都要重新算,因为模数不同...

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=;
int T,n,m,mo,sum[N];
ll C[N][N],f[N][N];
inline ll fk(ll x) { return x>=mo ? x-mo : x; }
int main()
{
T=read();
while(T--)
{
memset(f,,sizeof(f)); int a,b,flag=;
memset(sum,,sizeof(sum));
n=read(),m=read(),mo=read();
for(int i=;i<=m;i++)
{
a=read(),b=read();
sum[b]++;
}
for(int i=n;i;i--)
{
sum[i]+=sum[i+];
if(sum[i]>n-i+) { flag=; break; }
}
if(!flag) { printf("NO\n"); continue; }
// f[i][j]+=f[i+1][j-k]*C[j][k]
for(int i=;i<=;i++)
{
C[i][]=;
for(int j=;j<=i;j++)
C[i][j]=fk(C[i-][j]+C[i-][j-]);
}
f[n+][]=;
for(int i=n;i>=;i--)
for(int j=;j<=n-i+-sum[i];j++)
for(int k=;k<=j;k++)
f[i][j]=fk(f[i][j]+f[i+][j-k]*C[j][k]%mo);
printf("YES %lld\n",f[][n-m]);
}
return ;
}

P2523 [HAOI2011]Problem c的更多相关文章

  1. 洛谷P2523 [HAOI2011]Problem c(计数dp)

    题面 luogu 题解 首先,显然一个人实际位置只可能大于或等于编号 先考虑无解的情况 对于编号为\(i\),如果确认的人编号在\([i,n]\)中数量大于区间长度,那么就无解 记\(S[i]\)表示 ...

  2. 洛谷 P2523 [HAOI2011]Problem c

    洛谷1或洛谷2,它们是一样的题目,手动滑稽- 这一题我是想不出来, 但是我想吐槽一下坐我左边的大佬. 大佬做题的时候,只是想了几分钟,拍了拍大腿,干脆的道:"这不是很显然吗!" 然 ...

  3. 洛谷$P2523\ [HAOI2011]\ Problem\ c$ $dp$

    正解:$dp$ 解题报告: 传送门$QwQ$ 首先港下不合法的情况.设$sum_i$表示$q\geq i$的人数,当且仅当$sum_i>n-i+1$时无解. 欧克然后考虑这题咋做$QwQ$. 一 ...

  4. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  5. bzoj 2301: [HAOI2011]Problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 3757 Solved: 1671 [Submit] ...

  6. HAOI2011 problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1047  Solved: 434[Submit][ ...

  7. BZOJ 2298: [HAOI2011]problem a 动态规划

    2298: [HAOI2011]problem a Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnli ...

  8. BZOJ 2301: [HAOI2011]Problem b 莫比乌斯反演

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1007  Solved: 415[Submit][ ...

  9. 2301: [HAOI2011]Problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4164  Solved: 1888[Submit] ...

随机推荐

  1. 20180804 excel规划求解。。。

    把一个已经变量更出数据去求解

  2. The GuidRepresentation for the reader is CSharpLegacy, which requires the binary sub type to be Uuid

    使用客户端链接MongoDb报错 The GuidRepresentation for the reader is CSharpLegacy, which requires the binary su ...

  3. 使用注解装配Bean

    注解@Component代表Spring Ioc 会把 这个类扫描生产Bean 实例,而其中 value属性代表这个类在Spring 中的id,这就相当于XML方式定义的Bean  的 id 现在有了 ...

  4. linux 目录介绍

    /boot: 系统启动相关的文件,如内核.initrd,以及grub(bootloader)/dev: 设备文件 /etc:配置文件/home:用户的家目录,每一个用户的家目录通常默认为/home/U ...

  5. activemq 笔记

    官网下载好后,修改下conf下activemq.xml配置文件就可以了. 主要将这里的ip改成我们这里用的locahost就可以了: <transportConnectors> <! ...

  6. Mybatis 一对多 关联查询查询

    一对多 与 一对一 查询有许多相似之处. 最主要的区别是 查询结果是list,与之对应的标签为collection. 班级和学生,一个班有多个学生,而每个学生只能属于一个班. 此时班级编号作为学生表的 ...

  7. Java 有几种修饰符?分别用来修饰什么

    4种修饰符 访问权限   类   包  子类  其他包 public     ∨   ∨   ∨     ∨ protect    ∨   ∨   ∨     × default    ∨   ∨   ...

  8. mysql 全量备份以及增量备份

    MySQL 的全量备份很简单,增量备份虽然会手动使用但是还没写过脚本去实现增量备份.今天搞一搞,顺便回忆一下MySQL的基本操作.

  9. 电脑出现了一块tap window adapter v9 网卡 以及虚拟机桥接模式无法通信原因

    计算机与外界局域网的连接是通过主机箱内插入一块网络接口板(或者是在笔记本电脑中插入一块PCMCIA卡).网络接口板又称为通信适配器或网络适配器(network adapter)或网络接口卡NIC(Ne ...

  10. python中单下划线和双下划线的区别

    1.python中双下划线(__str__)代表这个变量是特殊变量,是可以直接访问的 __xxx___ 定义的是特列方法.像__init__之类的 2.python前面双划线(__name)代表这个变 ...