题目链接

https://atcoder.jp/contests/agc043/tasks/agc043_d

题解

考场上想到正确做法,然后思考实现细节的时候做法逐渐扭曲,最后GG……考后睡了一觉冷静了一下才改对,我是屑……
考虑序列归并的过程,可以发现每次会将某序列的相邻两个前缀最大值之间的部分依次加入。然后不难发现,最终产生的序列实际上和前缀最大值有某种神秘的关系。具体来讲,我们把每个前缀最大值开头到下一个之前的这部分单独看成一个组,而抛弃原来“划分成的 \(n\) 个小序列”的概念,组和组不同当且仅当组中至少一个元素不同,那么计数答案就相当于计数这样划分组的方案,满足所有组恰好能够拼成 \(n\) 个长度为 \(3\) 的序列,组之间无编号。
于是可以转化成将 \([1,3n]\) 这些数分成若干组,每组大小不超过 \(3\),组之间无编号,且大小为 \(1\) 的组数减去大小为 \(2\) 的组数大于等于 \(0\) 且为 \(3\) 的倍数。然后直接DP即可。
时间复杂度 \(O(n^2)\).

代码

#include<bits/stdc++.h>
#define llong long long
#define mkpr make_pair
#define riterator reverse_iterator
using namespace std;inline int read()
{int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f;
}const int mxN = 2000;
llong P;
llong f[mxN*3+3][mxN*4+3];
int n;void updsum(llong &x,llong y) {x = x+y>=P?x+y-P:x+y;}int main()
{scanf("%d%lld",&n,&P);f[0][n+1] = 1ll;for(int i=0; i<=3*n; i++){for(int j=-n; j<=3*n; j++){updsum(f[i+1][j+1+(n+1)],f[i][j+(n+1)]);updsum(f[i+2][j-1+(n+1)],f[i][j+(n+1)]*(i+1ll)%P);updsum(f[i+3][j+(n+1)],f[i][j+(n+1)]*(i+2ll)%P*(i+1ll)%P);}}llong ans = 0ll;for(int i=0; i<=n; i++){updsum(ans,f[3*n][3*i+(n+1)]%P);}printf("%lld\n",ans);return 0;
}

AtCoder AGC043D Merge Triplets (DP、组合计数)相关推荐

  1. Sit sit sit HDU - 5151 (区间dp +组合计数)

    这道这道区间DP,我也开始觉得其实区间DP是一种应用型的思想,做这类题目一个重要的点是在于题目情景的把握,这道题的一个情景就是数学的排列组合问题. 首先应用根据小区间推出大区间的思路,我们可以先固定一 ...

  2. CF1237F Balanced Domino Placements(dp+组合计数)

    CF1237F Balanced Domino Placements problem solution code problem 题目链接 solution 骨牌横着放会占用一行两列,骨牌竖着放会占用 ...

  3. 『递推』[AGC043D] Merge Triplets

    P r o b l e m \mathrm{Problem} Problem 给定如下构造生成长度为 3 N 3N 3N 的排列 P P P 的方法: 先生成一个长度为 3 N 3N 3N 的排列 A ...

  4. CF1237F Balanced Domino Placements(组合计数,dp)

    CF1237F Balanced Domino Placements Solution 显然可以先考虑横着的骨牌,再考虑竖着的骨牌.但是思路卡在了选取横着的骨牌会对竖着的骨牌的相邻对数产生影响. 然而 ...

  5. 数学知识——组合计数

    组合计数 文章目录 组合计数 概述 动态规划 牡牛和牝牛 思路 代码 隔板法 方程的解 思路 代码 序列统计 思路 代码 加法 & 乘法原理 加法原理 乘法原理 车的摆放 思路 代码 容斥原理 ...

  6. 解题报告(五)组合计数(ACM / OI)超高质量题解

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  7. 解题报告(二)E、(BZOJ3513) [MUTC2013] idiots(生成函数 + FFT + 组合计数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  8. 【Luogu4921】情侣?给我烧了!(组合计数)

    [Luogu4921]情侣?给我烧了!(组合计数) 题面 洛谷 题解 很有意思的一道题目. 直接容斥?怎么样都要一个平方复杂度了. 既然是恰好\(k\)对,那么我们直接来做: 首先枚举\(k\)对人出 ...

  9. 1307 牡牛和牝牛(组合计数-递推)

    1. 问题描述: 约翰要带 N 只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排,但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有 K 只牝牛.请计算 ...

最新文章

  1. 纯css3鼠标经过出现文字或图片鼠标移走消失
  2. 肖仰华:基于知识图谱的用户理解
  3. annotationdriven
  4. 解决:Unable to identify index name. XXXModel is not a Document. Make sure the document class is annota
  5. uni-app两种方法解决跨域问题【已验证】
  6. 限时!字节Java程序性能优化宝典开源,原来这才叫性能优化
  7. 中国大陆收货地址智能解析API
  8. 一张图慢慢转换成下一张图_如何把一张照片变成炫酷的动图?
  9. [转载]静息态fMRI、DTI、VBM
  10. acm 算法 java_有关acm算法的一道java题
  11. 计算机二级Web考试真题题库 上机考试系统 大纲教材 考试课程 讲解视频
  12. 「星火计划沙龙视频」腾讯Caelus在离线混合部署方案揭秘
  13. 中国科学技术大学2021计算机考研分数线,【中国科学技术大学】2021考研复试分数线3月13日已公布!速看!...
  14. Docker 安装 SRS
  15. Python贪吃蛇小游戏_完整源码免费分享
  16. 吴恩达deeplearning.ai深度学习课程空白作业
  17. winform如何修改exe文件的图标
  18. 瘦客户机、Windows终端和NC的差别
  19. Spring源码分析之BOP/IOC/DI/AOP
  20. Kerberos 身份认证原理

热门文章

  1. 3DSlicer16:数据类型MRML
  2. 鼠标取点——ginput()和getpts()详解
  3. C异常处理机制:setjmp和longjmp
  4. PDGAN: A Novel Poisoning Defense Method in Federated Learning Using Generative Adversarial Network笔记
  5. 如何在spring中读取properties配置文件里面的信息
  6. bootsect.s 预备——Linux-0.11 剖析笔记(一)
  7. ✅书单推荐の自我管理篇✅
  8. LIVE555再学习 -- OpenRTSP 源码分析
  9. 大数运算(8)——大数幂运算
  10. SpringBoot学习系列之一