题面

luogu

题解

首先,显然一个人实际位置只可能大于或等于编号

先考虑无解的情况

对于编号为\(i\),如果确认的人编号在\([i,n]\)中数量大于区间长度,那么就无解

记\(S[i]\)表示确认的人编号在\([i,n]\)中数量

我们只要考虑剩下的\(n - m\)人

\(f[i][j]\)表示编号\(>=i\)的,已经确认了\(j\)人

那么我们枚举多少人编号为\(i\)

\(f[i][j] = \sum f[i + 1][j - k] * (^j_k)\)

因为交换一些人的编号也是可行方案,所以乘上一个组合数

Code

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define RG register
  4. using namespace std;
  5. template<class T> inline void read(T &x) {
  6. x = 0; RG char c = getchar(); bool f = 0;
  7. while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;
  8. while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();
  9. x = f ? -x : x;
  10. return ;
  11. }
  12. template<class T> inline void write(T x) {
  13. if (!x) {putchar(48);return ;}
  14. if (x < 0) x = -x, putchar('-');
  15. int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;
  16. for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;
  17. }
  18. const int N = 310;
  19. int n, m, Mod, s[N], f[N][N], C[N][N];
  20. void pls(int &x, int y) {
  21. x += y;
  22. if (x >= Mod) x -= Mod;
  23. }
  24. void solve() {
  25. read(n), read(m), read(Mod);
  26. for (int i = 0; i <= 300; i++) C[i][0] = C[i][i] = 1;
  27. for (int i = 2; i <= 300; i++)
  28. for (int j = 1; j < i; j++)
  29. C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % Mod;
  30. memset(s, 0, sizeof(s));
  31. for (int i = 1, x; i <= m; i++) read(x), read(x), s[x]++;
  32. for (int i = n; i; i--) s[i] += s[i + 1];
  33. bool flag = 0;
  34. for (int i = 1; i <= n; i++)
  35. if (s[i] > n - i + 1) {
  36. flag = 1;
  37. break;
  38. }
  39. if (flag) {
  40. puts("NO");
  41. return ;
  42. }
  43. memset(f, 0, sizeof(f));
  44. f[n + 1][0] = 1;
  45. for (int i = n; i; i--)
  46. for (int j = 0; j <= n - i + 1 - s[i]; j++)
  47. for (int k = 0; k <= j; k++)
  48. pls(f[i][j], 1ll * f[i + 1][j - k] * C[j][k] % Mod);
  49. printf("YES %d\n", f[1][n - m]);
  50. return ;
  51. }
  52. int main() {
  53. int T;
  54. read(T);
  55. while (T--) solve();
  56. return 0;
  57. }

洛谷P2523 [HAOI2011]Problem c(计数dp)的更多相关文章

  1. 洛谷 P2523 [HAOI2011]Problem c

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

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

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

  3. 洛谷P2522 - [HAOI2011]Problem b

    Portal Description 进行\(T(T\leq10^5)\)次询问,每次给出\(x_1,x_2,y_1,y_2\)和\(d\)(均不超过\(10^5\)),求\(\sum_{i=x_1} ...

  4. 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)

    传送门 我们考虑容斥,设$ans(a,b)=\sum_{i=1}^a\sum_{j=1}^b[gcd(a,b)==k]$,这个东西可以和这一题一样去算洛谷P3455 [POI2007]ZAP-Quer ...

  5. 洛谷P2522 [HAOI2011]Problem b (莫比乌斯反演+容斥)

    题意:求$\sum_{i=a}^{b}\sum_{j=c}^{d}[gcd(i,j)==k]$(1<=a,b,c,d,k<=50000). 是洛谷P3455 [POI2007]ZAP-Qu ...

  6. 洛谷 P2519 [HAOI2011]problem a

    传送门 考虑转化为求最多说真话的人数 设$f(i)$表示排名前$i$的人中最多说真话的人的数量,考虑转移,如果由$j$转移而来,可以设$[j,i]$之间的人全都分数相等,那么式子就是$f[i]=f[j ...

  7. 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)

    题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...

  8. 洛谷 P2522 [HAOI2011]Problem b (莫比乌斯反演+简单容斥)

    题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...

  9. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

随机推荐

  1. ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法(转)

    ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法 分类: android应用开发2013-12-19 09:40 1045人阅读 评论(3) 收藏 举报 AndroidS ...

  2. centos7 redis伪集群安装

    安装gcc: yum install gcc -y   上传redis软件包到 /home下   解压: tar xf redis-3.2.11.tar.gz   进入 redis 目录 : cd r ...

  3. Zookeeper基本使用(转)

    一.Zookeeper架构 云计算越来越流行的今天,单一机器处理能力已经不能满足我们的需求,不得不采用大量的服务集群.服务集群对外提供服务的过程中,有很多的配置需要随时更新,服务间需要协调工作,这些信 ...

  4. .NET基础 (19)多线程

    多线程编程的基本概念1 请解释操作系统层面上的线程和进程2 多线程程序在操作系统里是并行执行的吗3 什么是纤程 .NET中的多线程1 如何在.NET程序中手动控制多个线程2 如何使用.NET的线程池3 ...

  5. ETL工作流缓慢原因查找方法

    What steps do you take to determine the bottleneck of a slow running ETL process? 如果ETL进程运行较慢,需要分哪几步 ...

  6. 初尝2D骨骼动画编辑工具SPINE,并into Unity3D

    一.SPINE使用 研究2D骨骼动画,CYou的朋友介绍我SPINE这个工具,开发自Esoteric Software的一款专门制作2D动画的软件,网络上的资料还很少,我这从半吊子美术技术的角度简单说 ...

  7. Oracle FND API–Create User

    --API - fnd_user_pkg.createuser----Example -- -- ---------------------------------------- API to CRE ...

  8. 【javascript】点击复制内容的实现

    各种站点有很多类似的代码,不过都是拿来即用,连个解释也没有.大概看了一下,现在主要使用的有两种办法: 1.documen.execCommand("Copy")或者window.c ...

  9. 微信小程序web-view之wx.miniProgram.redirectTo

    17年微信小程序官方提供了web-view组件. 官方描述:web-view组件是一个可以用来承载网页的容器,会自动铺满整个小程序页面.个人类型与海外类型的小程序暂不支持使用. 这段时间研究了一下小程 ...

  10. leetcode 合并两个有序数组

    给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: - 初始化 nums1 和 nums2 的元素数量分别为 m 和 ...