洛谷$P2523\ [HAOI2011]\ Problem\ c$ $dp$
正解:$dp$
解题报告:
首先港下不合法的情况.设$sum_i$表示$q\geq i$的人数,当且仅当$sum_i>n-i+1$时无解.
欧克然后考虑这题咋做$QwQ$.
一般的想法是枚人然后考虑给他啥编号.但是发现这样好像不太可做,所以考虑换一种思考方式.
考虑设$f_{i,j}$表示对于没安排的有$j$个人编号小于等于$i$的方案数
然后考虑转移,发现就枚给多少个人编号$i$就成.于是转移就$f_{i,j}=\sum f_{i+1,k}\cdot C(n-m-k,j-k).$
嗷然后补一个点$kk$.
就因为那个$mod$没有限制所以不能预处理阶乘逆元地搞,但是因为$n$的范围很小所以可以直接预处理数组$C_{i,j}$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define lf double
#define gc getchar()
#define t(i) edge[i].to
#define n(i) edge[i].nxt
#define w(i) edge[i].wei
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];~i;i=n(i)) const int N=300+10;
int n,m,mod,f[N][N],sum[N],jc[N],inv[N],C[N][N]; il int read()
{
rc ch=gc;ri x=0;rb y=1;
while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
if(ch=='-')ch=gc,y=0;
while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
return y?x:-x;
}
il void ad(ri &x,ri y){x+=y;if(x>=mod)x-=mod;}
il void pre(){rp(i,0,n){C[i][0]=1;rp(j,1,i)C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;}}
il void solv()
{
memset(f,0,sizeof(f));memset(sum,0,sizeof(sum));
n=read();m=read();mod=read();pre();rp(i,1,m){read();++sum[read()];}
my(i,n,1){sum[i]+=sum[i+1];if(sum[i]>n-i+1){printf("NO\n");return;}}
f[n+1][0]=1;
my(i,n+1,1)
{
rp(j,0,n-sum[i]-i+1)
{
rp(k,0,min(j,n-sum[i+1]-(i+1)+1))
ad(f[i][j],1ll*f[i+1][k]*C[n-m-k][j-k]%mod);//,
//printf("f[%d][%d]+=f[%d][%d]*%d C[%d][%d]=%d\n",i,j,i+1,k,C[n-m-k][j-k],n-m-k,j-k,C[n-m-k][j-k]);
}
}
printf("YES %d\n",f[1][n-m]);
} int main()
{
freopen("2523.in","r",stdin);freopen("2523.out","w",stdout);
ri T=read();while(T--)solv();
return 0;
}
随机推荐
- ping的使用
ping -t cnblogs.com 可以一直ping网址显示对应的响应时间
- Oracle中的Union、Union All、Intersect、Minus[转]
众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考. 假设我们有一个表Student,包括以下字段与数据: drop table student; create table ...
- Hbase API: 读Bigtable
- 6 获取请求头和URL信息
@app.route("/req",methods=['GET','POST'])def req(): print(request.headers) #请求头的信息全部在这里面 p ...
- 新浪微博API错误代码说明对照表 http://open.weibo.com/wiki/Error_code
http://open.weibo.com/wiki/Error_code 这篇文章资料是从新浪微博开发平台分享过来,一方面是博主自己开发过程遇到问题对错误代码的快捷查询,不用每次都得到官方找:另一方 ...
- 什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?
https://mp.weixin.qq.com/s/Co1LxS2h_ILh9syOmshjZg 什么是CGI CGI全称是“公共网关接口”(Common Gateway Interface),HT ...
- Android ListView性能优化实例讲解
前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...
- 神经网络为什么需要多次epoch
Δw(t)=−ε ∂w(t)∂E +αΔw(t−1)(9) 我们知道反向传播每次迭代的效果是这样的:w=w+Δw(t) w=w+\Delta w(t)w=w+Δw(t) 我们知道,每条训练数据都会导 ...
- ES6学习笔记第一天
## 三.const和let **3.1 const** const用来定义常量,所谓的常量就是值一旦给定后就不变,一次定义终身不变的量 const a = 10; a = 20; 上面的a就是一个常 ...
- linux 字符设备注册
如我们提过的, 内核在内部使用类型 struct cdev 的结构来代表字符设备. 在内核调用你 的设备操作前, 你编写分配并注册一个或几个这些结构. [11] 11为此, 你的代码应当包含 < ...