[AGC043D] Merge Triplets

news/2024/6/16 2:48:40 标签: 算法, 动态规划

题目传送门

很有意思的计数题

解法

考虑经过操作后得到的排列的性质


性质1:
p r e ( i ) pre(i) pre(i):前i个位置的最大值,则不会出现超过3个的连续位置的 p r e pre pre相同
必要性
考虑反证,若有超过 3 3 3个的连续位置的 p r e pre pre相同,那么至少有连续有连续三次选择了比第一次选择要小的数,那么至少一个块的长度为 4 4 4,题目中规定块长为 3 3 3,因此不合法
充分性
发现没有充分性,比如: { 2 , 1 , 4 , 3 , 6 , 5 } \{2,1,4,3,6,5\} {2,1,4,3,6,5},手玩模拟一下就会发现有问题
性质2
若排列总长为 3 N 3N 3N, i i i个的连续位置的 p r e pre pre相同的个数为 c n t i cnt_i cnti,那么 c n t 2 ≤ N − c n t 3 cnt_2\le N-cnt_3 cnt2Ncnt3
必要性
对于 c n t 2 cnt_2 cnt2 c n t 3 cnt_3 cnt3来说,他们对应的块内的大小关系是一定的,所以可得 c n t 2 + c n t 3 ≤ N cnt_2+cnt_3\le N cnt2+cnt3N,移项就行了
我们可以化简:
c n t 2 ≤ N − c n t 3 ⇒ 3 c n t 2 ≤ 3 N − 3 c n t 3 ⇒ 3 c n t 2 ≤ ( c n t 1 + 2 c n t 2 + 3 c n t 3 ) − 3 c n t 3 ⇒ 移项得 c n t 2 ≤ c n t 1 \begin{aligned} &cnt_2\le N-cnt_3\\ \Rightarrow&3cnt_2\le 3N-3cnt_3\\ \Rightarrow&3cnt_2\le (cnt_1+2cnt_2+3cnt_3)-3cnt_3\\ \Rightarrow^{移项得}&cnt_2\le cnt_1 \end{aligned} 移项得cnt2Ncnt33cnt23N3cnt33cnt2(cnt1+2cnt2+3cnt3)3cnt3cnt2cnt1

最后我们发现性质1性质2加起来就有了充分性


状态设计:

f i , j : 前 i 个数, c n t 1 − c n t 2 = j 的方案数 f_{i,j}:前i个数,cnt_1-cnt_2=j的方案数 fi,j:i个数,cnt1cnt2=j的方案数
显然 a n s = ∑ k = 0 3 n f 3 n , k ans=\sum_{k=0}^{3n} f_{3n,k} ans=k=03nf3n,k

状态转移:

考虑从小到大放数,对放 1 / 2 / 3 1/2/3 1/2/3个数分别考虑
f i , j → f i + 1 , j + 1 f i , j → f i + 2 , j − 1 ∗ ( i − 1 ) f i , j → f i + 3 , j ∗ ( i − 1 ) ∗ ( i − 2 ) \begin{aligned} &f_{i,j}\to f_{i+1,j+1}\\ &f_{i,j}\to f_{i+2,j-1}*(i-1)\\ &f_{i,j}\to f_{i+3,j}*(i-1)*(i-2) \end{aligned} fi,jfi+1j+1fi,jfi+2,j1(i1)fi,jfi+3j(i1)(i2)
就好了

code:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 7, M = N * 3;
typedef long long ll;
int n,mod,ans;
int f[M][M<<1];
int ad(int x,int y){ return (1ll*x+1ll*y)%mod; }
void work(int i,int j){
	f[i+1][j+1+M]=ad(f[i+1][j+1+M],f[i][j+M]);
	f[i+2][j-1+M]=ad(f[i+2][j-1+M],1ll*f[i][j+M]*(i+1)%mod);
	f[i+3][j+M]=ad(f[i+3][j+M],1ll*f[i][j+M]*(i+1)%mod*(i+2)%mod);
}
int main() {
	scanf("%d%d",&n,&mod); n=n*3;
	f[0][M]=1;
	for(int i=0;i<n;i++) 
		for(int j=-i;j<=i;j++) 
			work(i,j);
	for(int i=0;i<=n;i++) 
		ans=ad(ans,f[n][i+M]);
	printf("%d\n",ans);
}

TXL


http://www.niftyadmin.cn/n/4999238.html

相关文章

计算机的存储规则(ASCII,GBK,Unicode)

不爱生姜不吃醋⭐️⭐️⭐️ 声明&#xff1a; &#x1f33b;本文写的是关于计算机的存储规则 ❗️ &#x1f33b;看完之后觉得不错的话麻烦动动小手点个赞赞吧&#x1f44d; &#x1f33b;如果本文有什么错误的话欢迎在评论区中指正哦&#x1f497; &#x1f33b;与其明天开始…

05-Mysql夺命三连问:什么是索引下推?什么是索引覆盖?什么是回表?【Java面试总结】

Mysql夺命三连问&#xff1a;什么是索引下推&#xff1f;什么是索引覆盖&#xff1f;什么是回表&#xff1f; 索引下推是mysql5.6 提出的一个查询优化方案&#xff0c;主要的目的是减少数据或查询中不必要的读取和计算&#xff0c;它的原理是将查询条件尽可能的推送到索引层面…

MATLAB算法实战应用案例精讲-【概念篇】大模型

目录 前言 几个相关概念 几个高频面试题目 ChatGPT 技术和传统的 AI 有什么区别? 大模型使用哪些并行训练方法?

【ProxMox7.2】创建win10虚拟机

创建win10虚拟机 1.创建虚拟机2.操作系统3.系统4.磁盘5.CPU设置6.内存7. 网络8.确认9. 安装 1.创建虚拟机 名字随便命名 2.操作系统 这里选择自己ios版本选择 2008r2类型 选择windows 3.系统 机型选择默认i44fxscsi控制器选择Virtio Scsi 4.磁盘 这里存储选择自己大的一…

2023.09.03 学习周报

文章目录 摘要文献链接题目亮点本文工作 题目亮点本文工作 题目亮点本文工作 大气污染物传输的相关内容总结 摘要 本周阅读了三篇论文&#xff0c;第一篇文章的核心为改进PageRank算法和标签传播算法实现大气污染物传输分析模型&#xff0c;第二篇文章的核心为将SOD、VGG和LST…

使用ppt和texlive生成eps图片(高清、可插入latex论文)

一、说明 写论文经常需要生成高清的图片插入到论文中&#xff0c;本文以ppt画图生成高质量的eps图片的实现来介绍具体操作方法。关于为什么要生成eps图片&#xff0c;一个是期刊要求&#xff08;也有不要求的&#xff09;&#xff0c;另一个是显示图像的质量高。 转化获得eps…

BBR cwnd_gain 的循环依赖 bug

同事咨询了一个有趣的问题&#xff0c;bbr 在probe bw 状态下&#xff0c;rtt 变小了&#xff0c;但采集到的 delivery date 却没变&#xff0c;此时算出来的 cwnd 变小&#xff0c;限制了 sender 发送。这种情况应该调什么参数。 这是 bbr 一个典型的循环依赖 bug&#xff0c…

中国有那些公司需要HPC(高性能计算)的程序员?

不看不知道&#xff0c;一看吓一跳。HPC早就不是之前那样只存在于研究机关的角色了。尤其是2023年以来&#xff0c;中国有许多公司和研究机构需要高性能计算&#xff08;HPC&#xff09;的程序员&#xff0c;特别是在领域如科学研究、工程模拟、天气预报、金融建模、人工智能等…