记录编号 374854 评测结果 AAAAAAAAAA
题目名称 [HAOI 2011]问题C 最终得分 100
用户昵称 Gravatarsxysxy 是否通过 通过
代码语言 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;
}