记录编号 |
374854 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HAOI 2011]问题C |
最终得分 |
100 |
用户昵称 |
sxysxy |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
4.173 s |
提交时间 |
2017-02-24 07:57:21 |
内存使用 |
1.69 MiB |
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m, M;
long long C[302][302], f[302][302];
int cnt[302], sum[304];
void pre(){
memset(C, 0, sizeof(C));
memset(f, 0, sizeof(f));
memset(cnt, 0, sizeof(cnt));
C[0][0] = 1;
for(int i = 1; i <= n; i++){
C[i][0] = 1;
for(int j = 1; j <= i; j++)C[i][j] = (C[i-1][j-1]+C[i-1][j])%M;
}
}
void work(){
scanf("%d %d %d", &n, &m, &M);
int p;
sum[0] = n-m;
pre();
for(int i = 1, x; i <= m; i++)
scanf("%*d %d", &x), cnt[x]++;
for(p = 1; p <= n; p++){
sum[p] = sum[p-1]+cnt[p];
if(sum[p] < p){
puts("NO");
return;
}
}
if(p != n+1)return;
f[0][0] = 1;
for(int i = 1; i <= n; i++)
for(int j = sum[i]; j >= i; j--)
for(int k = j-i+1; k >= cnt[i]; k--)
f[i][j] = (f[i][j]+f[i-1][j-k]*C[sum[i]-j+k-cnt[i]][k-cnt[i]])%M;
printf("YES %lld\n", f[n][n]);
}
int main(){
freopen("c.in", "r", stdin);
freopen("c.out", "w", stdout);
int T; scanf("%d", &T);
while(T--)work();
return 0;
}