我搬运我自己应该算原创吧

题目

  • 题意
  • 题解

题意

对于一个长度为nnn的正整数数列ana_nan​, 他合法的条件是:

  1. ∀i∈[1,n],ai∈1,2,…,n\forall i \in [1, n], a_i \in {1, 2, \dots, n}∀i∈[1,n],ai​∈1,2,…,n;
  2. ∀i∈[1,n],pi−pi−1≤1(pk=maxa1,a2,…,ak,p0=0)\forall i \in [1, n], p_i - p_{i-1} \le 1 (p_k = max \\{ a_1, a_2, \dots, a_k \\}, p_0 = 0)∀i∈[1,n],pi​−pi−1​≤1(pk​=maxa1​,a2​,…,ak​,p0​=0).

对于每一个 t=1,2,…,nt = 1, 2, \dots, nt=1,2,…,n, 求

∑A∈Sncnt(A,t)2\sum_{A \in S_n}cnt(A, t)^2A∈Sn​∑​cnt(A,t)2

其中, SnS_nSn​是所有长度为nnn的合法序列的集合, cnt(A,t)cnt(A, t)cnt(A,t)是ttt在数列AAA中出现的次数.

答案对mmm取模.

TTT组测试, 给出n,mn, mn,m

1≤T≤10,1≤n≤3000,1≤m≤1091 \le T \le 10, 1 \le n \le 3000, 1 \le m \le 10^91≤T≤10,1≤n≤3000,1≤m≤109

题解

感谢zzs, 舍友书名号, 大佬jyz, 我终于理解了这道数数题.

直接求显然不合理, 我们需要从平方的组合意义上"拆贡献".

首先考虑x2x^2x2代表什么. 比如小明有xxx个数, 分别为1,2,…n1, 2, \dots n1,2,…n, 小红也有同样的xxx个数. 两人分别出一个数, 有序配对, 有多少中配对方法. 这个答案就是x2x^2x2.

这里只不过反过来, 把x2x^2x2拆成配对数, 如下:

cnt(A,t)2=∣⟨i,j⟩∣ai=aj=t,1≤i,j≤n∣cnt(A, t)^2 = \Big| \\{ \left \langle i, j \right \rangle \mid a_i = a_j = t, 1 \le i, j \le n \\} \Big|cnt(A,t)2=∣∣∣​⟨i,j⟩∣ai​=aj​=t,1≤i,j≤n∣∣∣​

所以有:

KaTeX parse error: \cr valid only within a tabular/array environment

这算的是"所有合法序列AAA中, 满足条件ai=aj=ta_i = a_j = tai​=aj​=t的有序对$\langle i, j \rangle 有多少个".可以转化成"对于满足条件有多少个". 可以转化成"对于满足条件有多少个".可以转化成"对于满足条件a_i = a_j = t的所有有序对的所有有序对的所有有序对\langle i, j \rangle,有多少个合法序列, 有多少个合法序列,有多少个合法序列A$"

即:

KaTeX parse error: \cr valid only within a tabular/array environment

计算有序对数量时, 如果i≠ji \ne ji​=j, 那么有序对数量可以用无序对数量乘以222表示; 如果i=ji=ji=j, 有序无序是一样的东西. 所以, 上述式子进一步可以写成:

KaTeX parse error: \cr valid only within a tabular/array environment

先来看如何求∑1≤i≤n∣A∈Sn∣ai=t∣\sum_{1 \le i \le n} \Big| \\{ A \in S_n \mid a_i = t \\} \Big|∑1≤i≤n​∣∣∣​A∈Sn​∣ai​=t∣∣∣​.

枚举i,ai=ti, a_i = ti,ai​=t, 只要能够快速知道合法的前缀和后缀各有多少, 然后相乘即可. 可以用dpdpdp求合法前缀和后缀. 设f(i,j)f(i, j)f(i,j)为最大值为jjj的长度为iii的合法序列数量, 方程:

f(i,j)=j⋅f(i−1,j)+f(i−1,j−1)f(i, j) = j \cdot f(i-1, j) + f(i-1, j-1)f(i,j)=j⋅f(i−1,j)+f(i−1,j−1)

解释如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zy7OwbJ4-1619673505287)(/img/vp-2020-ccpc-qinhuangdao-site/f.jpg)]

设g(i,j)g(i, j)g(i,j)为(强行)**a1=ja_1 = ja1​=j**时, 前缀最大值增加不超过111, 长度为iii的合法序列数量.

为什么要这么定义呢? 因为已经枚举了ai=ta_i = tai​=t, 后面的序列也满足前缀最大增加量不超过111, 首先得把ttt考虑进来, 然后还要考虑后面有多少个数. 这样的定义是没问题的. 难点在于方程转移:

g(i,j)=j⋅g(i−1,j)+g(i−1,j+1)g(i, j) = j \cdot g(i-1, j) + g(i-1, j+1)g(i,j)=j⋅g(i−1,j)+g(i−1,j+1)

解释如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYFfxG4f-1619673505289)(/img/vp-2020-ccpc-qinhuangdao-site/g.jpg)]

枚举ttt第一次出现的位置iii, 选择两个ttt配对, 有下面这些情况:

  1. 选的两个ttt相同, 都是aia_iai​, 贡献为f(i−1,t−1)⋅g(n−i+1,t)f(i-1, t-1) \cdot g(n - i + 1, t)f(i−1,t−1)⋅g(n−i+1,t)
  2. 选的两个ttt不同, 第一个是aia_iai​, 第二个是后面某一个aj=ta_j = taj​=t, 贡献为2⋅f(i−1,t−1)⋅(n−i)g(n−i,t)2 \cdot f(i-1, t-1) \cdot (n-i)g(n-i, t)2⋅f(i−1,t−1)⋅(n−i)g(n−i,t)(还是插入法, 在n−1n-1n−1个元素的合法后缀之间插入一个ttt, 就相当于"枚举"到了这个aj=ta_j = taj​=t, 有序, 乘以222)
  3. 选的两个ttt相同, 是后面某一个aj=ta_j = taj​=t, 贡献为f(i−1,t−1)⋅(n−1)⋅g(n−i,t)f(i-1, t-1) \cdot (n-1) \cdot g(n-i, t)f(i−1,t−1)⋅(n−1)⋅g(n−i,t)
  4. 选的两个ttt不同, 都在iii后面, 贡献为2⋅(n−i2)f(i−1,t−1)⋅g(n−i−1,t)2 \cdot \tbinom{n-i}{2} f(i-1, t-1) \cdot g(n-i-1, t)2⋅(2n−i​)f(i−1,t−1)⋅g(n−i−1,t)

注意到ai=ta_i = tai​=t的一个必要条件是t≤it \le it≤i, 在推fff和ggg的时候需要注意.

边界条件很简单, 略.

还需注意, 在枚举iii的过程中, 如果后面的个数不足, 则不能转移.

复杂度O(n2)O(n^2)O(n2)

{{% code %}}

const int maxn = 3e3+10;int t, n, P;LL Plus(LL a, LL b) {return a + b >= P ? (a + b) % P : a + b;
}LL Mult(LL a, LL b) {return a * b >= P ? a * b % P : a * b;
}LL f[maxn][maxn], g[maxn][maxn], ans[maxn];int main() {scanf("%d", &t);for (int kase = 1; kase <= t; kase++) {scanf("%d%d", &n, &P);memset(f, 0, sizeof(f));memset(g, 0, sizeof(g));memset(ans, 0, sizeof(ans));f[0][0] = 1;for (int i = 1; i <= n; i++)for (int j = 1; j <= i; j++)f[i][j] = Plus(f[i-1][j-1], Mult(j, f[i-1][j]));for (int j = 1; j <= n; j++)g[1][j] = 1;for (int i = 2; i <= n; i++)for (int j = (n - i + 1); j; j--)g[i][j] = Plus(g[i-1][j+1], Mult(j, g[i-1][j]));// 对每个t, 枚举其第一次出现的位置i, 由**题目**可知i >= tfor (int t = 1; t <= n; t++)for (int i = t; i <= n; i++) {// 两次选i这个位置的tans[t] = Plus(ans[t], Mult(f[i-1][t-1], g[n-i+1][t]));// 第一次选i这个位置的t, 第二次选后面某一个t// 由于有序, 所以乘以2if (i < n)ans[t] = Plus(ans[t], Mult(Mult(2, f[i-1][t-1]), Mult(n-i, g[n-i][t])));// 两次选后面同一个tif (i < n)ans[t] = Plus(ans[t], Mult(f[i-1][t-1], Mult(n-i, g[n-i][t])));// 两次选后面不同的tif (i + 1 < n)ans[t] = Plus(ans[t], Mult(Mult(f[i-1][t-1], n-i), Mult(n-i-1, g[n-i-1][t])));}printf("Case #%d:\n", kase);for (int t = 1; t <= n; t++)printf("%lld ", ans[t]);puts("");}return 0;
}

{{% /code %}}

2020 CCPC 秦皇岛 H.Holy Sequence相关推荐

  1. 2020 CCPC 秦皇岛 K. Kingdom‘s Power(树形DP)

    传送门 题目大意 给出一棵根节点为111的树,其中树根上面有无穷的士兵,每分钟我们能调取一队士兵走一条边,如果该节点没有被占领那么会占领该节点,问占领所有节点需要的最少时间. 解题思路 首先要能简单证 ...

  2. 2020 ccpc 吉林省赛 H

    2020 ccpc 吉林省赛 H 题意: 给一组数 a i a_i ai​,求 ∑ i = 1 n ∑ j = 1 n [ g c d ( a i , a j ) = d ] \sum\limits_ ...

  3. CCPC秦皇岛gym102361A. Angle Beats

    CCPC秦皇岛gym102361A. Angle Beats 题意: 给你n个点的坐标,现在有q次询问,每次询问给你一个坐标,问这个坐标可以与给定的n个点组成多少个不同的直角三角形 n<=200 ...

  4. 2020 CCPC 绵阳站 J-Joy of Handcraft (调和级数 线段树)

    2020 CCPC 绵阳站 J-Joy of Handcraft (调和级数 线段树) 之前一直对线段树有种恐惧感,感觉十分晦涩难懂,但是我还是得迎男而上!这题必须补!我说的!耶稣都留不住! 题目 h ...

  5. MUV LUV UNLIMITED(ccpc 秦皇岛2019)

    MUV LUV UNLIMITED(ccpc 秦皇岛2019) 题目描述 There are few entertainments in United Nations 11th Force, Paci ...

  6. H - Holy Grail

    H - Holy Grail 题意: 题干又臭又长 我简单说说 n个点,m条有向边,边权为负,然后给你六组起始点(s点和t点),你要在s和t之间建一个有向边,要使得权值最小,问这六组边依次是多少? 不 ...

  7. 尚硅谷周阳老师2020年 SpringCloud(H版和Alibaba) 视频教程学习时整理的笔记记录和代码

    尚硅谷周阳老师2020年 SpringCloud(H版和Alibaba)视频教程学习时整理的笔记记录和代码 尚硅谷周阳老师SpringCloud(H版和Alibaba)学习.代码摘录,下面是各个mod ...

  8. Good Number Gym - 102769G 2020年CCPC秦皇岛分站赛

    题意: 如果一个数字是Good Number,当且仅当 ⌊xk⌋\left \lfloor\sqrt[k]{x}\right \rfloor⌊kx​⌋(向下取整) 能整除 x . 现在给出 n,k , ...

  9. Friendly Group Gym - 102769F 2020(并查集)ccpc秦皇岛分站赛

    题意: n个学生要组成一个小组参加会议(可以不参加), 1.对于每两个朋友(x ,y),如果他们俩都参加会议,该小组的友好价值将会增加 1:如果其中只有一位参加会议,则该组的友好价值将降低 1. 3. ...

最新文章

  1. python 打印列表对象,python – 打印对象列表
  2. A.01.01—模块的输入—低端输入
  3. java数组创建后大小能改变吗,在Java中,数组创建成功以后,其大小(??? )(能/不能)改变...
  4. jvm运行时数据区是干啥的?CPU切换线程会不会突然忘记程序执行到哪一步了
  5. kali2018安装教程_Kali Linux + Windows10双系统安装教程
  6. kali2020提高权限到root
  7. ik分词和jieba分词哪个好_Python 中文 文本分析 实战:jieba分词+自定义词典补充+停用词词库补充+词频统计...
  8. java定义基础变量语句_编程语言第一:JAVA语言基础,变量
  9. Linux下 对文件行数打乱(乱序排列)
  10. maven本地安装jar
  11. MongoDB文档查询操作(三)
  12. Python机器视觉--OpenCV入门--机器视觉与OpencCV用途简介
  13. swfupload 无法加载_swfupload提示“错误302”的解决方法
  14. 《大侦探福尔摩斯2:诡影游戏》蓝光高清720P 1080P下载[2011最新动作]
  15. 如何将win10电脑主题设置成深色
  16. 带记事功能的日历插件fullCalendar
  17. java 进度条时间设置_java进度条
  18. [免费视频教程]UI自动化测试之Jenkins配置教程
  19. 合工大计算机考研数学,[考研干货]一战上岸合肥工业大学,来给大家分享一下考研心得...
  20. 怎么做动图?轻松在线制作gif动图的技巧

热门文章

  1. android webview 播放视频
  2. 【Android适配问题集锦-相机类】Camera拍照时快门咔嚓声适配问题
  3. MBTI职业性格测试(Psytopic特别版) 1
  4. 网页开发之仿华为商城案例(内附压缩包下载链接)
  5. ABLIC推出S-82D1A系列单节电池保护IC
  6. html获取孩子节点,JS实现JQuery children()方法,获取某个元素下所有子元素节点或者某个元素下指定标签元素 – Fakin's Blog...
  7. POI方式替换Word中的文字
  8. PPT配色中国风——长安十二时辰
  9. 2022-2028全球与中国尾部支出管理解决方案市场现状及未来发展趋势
  10. 视频太大了怎么弄小一点?