27 LCA模拟赛3T3 三等分的数组 题解

news/2025/10/16 15:09:54/文章来源:https://www.cnblogs.com/michaele/p/19145690

三等分的数组

题面

小 Y 有一个长度为 \(n\) 的数组,数组中的每个数都是一个 \(1 \sim m\) 之间的正整数。

小 Y 决定将这个数组分成若干个三元组:每个三元组要么由三个相同的数字组成,要么由三个连续的数字组成。换句话说,每个三元组的形式要么是 \((x, x, x)\),要么是 \((x, x + 1, x + 2)\),其中 \(x\) 是一个正整数。

求出将数组分成三元组的方案数,答案对 \(10^9 + 7\) 取模。

\(1 \le n \le 5000,\ 1 \leq a_i \leq m \leq 5000\)

其中 \(n\)\(3\) 的倍数。

题解

我们可以直接考虑大小为 \(i\) 的所有整数而不是每个数字,这样显然更方便我们进行分组。

因为要考虑连续三个数分成一组的情况,所以我们要记录一下当前数字还剩多少以及上个数字还剩多少,从而转移到下一个数字。

\(f(i,j,k)\) 表示考虑了前 \(i\) 个数字,\(i - 2\) 以及更小的数字保证没有剩余,\(i - 1\) 还剩 \(j\) 个,\(i\) 还剩 \(k\) 个的方案数。初始 \(f(1, 0, c_1) = 1\)

有转移:

\[\begin{align*} &f(i,j,k) \to f(i + 1, k - j, c_{i + 1} - j) \\ &f(i,j,k) \to f(i, j, k - 3) \end{align*} \]

这个状态数好像很大,为 \(O(n^3)\),但实际上远远到不了那么大,因为 \(\sum c_i = n\)

我们可以证明,其状态数不会超过 \(O(n^2)\)

\(A = \sum_{i \in odd} c_i,\ B = \sum_{i \in even},\ C = \sum_{i = 1}^{m - 1} c_i \times c_{i + 1}\),其中 \(C\) 即为我们的状态数。

不难发现 \(A \times B > C, A + B = n\)

由基本不等式可得 \(A + B \ge 2\sqrt{A \times B}\) ,所以 \(A \times B \le \frac {n^2} 4\)

所以时间复杂度和空间复杂度都是对的,空间可以用 vector 或者滚动数组。

code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <vector>using namespace std;namespace michaele {typedef long long ll;const int N = 5e3 + 10;const int mod = 1e9 + 7;int n, m;int c[N];void solve () {cin >> n >> m;for (int i = 1; i <= n; i ++) {int x;cin >> x;c[x] ++;}vector <vector <vector <ll> > > f (m + 5, vector <vector <ll> > ());for (int i = 0; i <= m; i ++) {if (i) {f[i].resize (c[i - 1] + 5);for (int j = 0; j <= c[i - 1]; j ++) {f[i][j].resize (c[i] + 5);}} else {f[i].resize (10);}}f[1][0][c[1]] = 1;for (int i = 1; i < m; i ++) {for (int j = 0; j <= c[i - 1]; j ++) {for (int k = c[i]; k >= 0; k --) {auto now = f[i][j][k];if (k >= j && c[i + 1] >= j) {auto &nt = f[i + 1][k - j][c[i + 1] - j];nt += now;if (nt >= 1e18) {nt %= mod;}}if (k >= 3) {auto &nt = f[i][j][k - 3];nt += now;if (nt >= 1e18) {nt %= mod;}}}}}for (int k = c[m]; k >= 0; k --) {if (k >= 3) {f[m][0][k - 3] += f[m][0][k];if (f[m][0][k - 3] > 1e18) {f[m][0][k - 3] %= mod;}}}cout << f[m][0][0] % mod << endl;}}int main () {michaele :: solve ();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/938276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

26 LCA模拟赛3T2 连边 题解

连边 题面 给定一张初始 \(n\) 个点,没有边的图。 给定 \(m\) 表示有 \(m\) 个时刻,第 \(i\) 个时刻会将 \(gcd(a,b) = m - i + 1\) 某些点连起来。 有 \(q\) 个询问,每次询问给定 \(x, y\),你需要回答 \(x, y\) 最…

28 S2模拟赛T2 开会council 题解

council 题面 给定一棵 \(n\) 个节点的树,每个节点有黑白两种颜色,还有 \(k\) 个特殊节点。 设距离表示两个点间路径上边权的最大值。 我们每次指定一个白点,对于每个黑点,设 \(disb\) 表示其到任意一个特殊点距离…

25 LCA模拟赛3T1 ROI 2012马赛克 题解

马赛克 题面 题解 这道题想了很久如何快速求出一个点最右边或者最左边的不相容点,但是没有什么思路。 我们将题目中给定的有序对抽象为 \((a,b)\)。 最后 xpigeon 带神给出了一个结论,就是一段序列中只要出现了两个互…

实验记录2025/10/14

我现在是把picsize从640变化到了960,而且把原先7000张的训练数据集精简成了3600张的数据集 下面是跑出来的结果: Validating runs/detect/yolo11-tea-yolo11s36/weights/best.pt... Ultralytics 8.3.182 🚀 Python…

个人微信开发框架

个人微信开发框架、微信二次开发api、个人微信开发api接口,微信个人号开发API WTAPI开放平台是基于微信开放平台的二次封装API服务,开发者可以使用本服务来处理微信中的各种事件,并可以通过后台调用对应的 API 来驱…

投资指标技术分析

投资指标技术分析指数平滑移动平均线(MACD) 移动平均线收敛差异(MACD)是一种振荡类型的指标,该指标被交易者广泛用于技术分析(TA)中。MACD是一种趋势跟踪工具,利用移动平均线来确定股票、加密货币或其他可交易…

linux源码编译python

1. 下载python源码 python官网(https://www.python.org/)下载源码包 例如python3.8: Index of /ftp/python/3.8.9/ 2. 安装依赖yum install -y zlib zlib-devel sqlite-devel libffi-devel gcc openssl-devel libff…

uni-app x开发商城系统,Swiper 轮播图

一、概述 该组件一般用于导航轮播,广告展示等场景,可开箱即用,具有如下特点:自定义指示器模式,可配置指示器样式 3D轮播图效果,满足不同的开发需求 可配置显示标题,涵盖不同的应用场景 具有设置加载状态和嵌入视…

昂瑞微OM6651A:国产车规级蓝牙芯片的破局者

OM6651A——第二颗车规级低功耗蓝牙芯片,成功通过涵盖机械应力、温湿度循环等7大类共41项极限测试,斩获赛宝实验室颁发的AEC Q-100 Grade1认证(-40~125℃)。这颗采用3x2.7x0.5mm极薄LGA封装的芯片,以超低功耗与越…

2025年中央空调/锅炉房/机房运维服务厂家最新权威推荐榜:专业托管与维修外包一体化解决方案精选

2025年中央空调/锅炉房/机房运维服务厂家最新权威推荐榜:专业托管与维修外包一体化解决方案精选随着我国工业化和城市化进程的加速推进,暖通空调及动力设备运维服务行业迎来了前所未有的发展机遇。作为建筑能源系统的…

【终极解决方案】api-ms-win-core-path-l1-1-0.dll 缺失?Win7/Win10/Win11完整修复教程

许多用户在运行游戏、设计软件或系统程序时,遇到“api-ms-win-core-path-l1-1-0.dll 缺失”错误提示。本文详细解析该 DLL 文件的作用、报错原因,并提供三种高效修复方案:一键DLL修复工具、手动注册方法以及 Win7 专…

2025 年最新推荐分切机实力厂家权威榜单:覆盖全自动高速、铝箔、薄膜、高精度等机型,为软包装企业精选优质设备

随着软包装行业不断升级,分切机作为核心生产设备,其品质与性能直接关系到企业的生产效率、产品质量及市场竞争力。当前市场上,分切机厂家数量繁杂,部分厂家设备存在精度不足、材料适配性差、售后服务缺失等问题,导…

打破应用跳转流失困局,提升推广链接转化率

在移动互联网生态中,应用是用户高频使用的核心入口,而跳转应用是连接用户需求与服务落地的核心桥梁,能够提升用户活跃度与留存。传统流程需先跳转网页再手动引导至应用市场,多一步操作导致流失率增加,尤其影响广告…

《Vue3 + Vite + Pinia 实现后台管理系统:路由权限控制与动态菜单渲染》

《Vue3 + Vite + Pinia 实现后台管理系统:路由权限控制与动态菜单渲染》从零构建 Vue3 后台管理项目,包括 Vite 项目初始化、Pinia 状态管理(用户信息 / 权限存储)、基于角色的路由权限控制(router.beforeEach 拦…

检查cpu是否支撑minio方法

#!/bin/sh flags=$(cat /proc/cpuinfo | grep flags | head -n 1 | cut -d: -f2) supports_v2=awk "/cx16/&&/lahf/&&/popcnt/&&/sse4_1/&&/sse4_2/&&/ssse3/ {found=1}…

性能测试进阶秘籍:如何用JMeter分布式压测挖掘系统极限潜

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 "我们的系统明明配置很高,为什么单机压测TPS死活上不去?"这是无数工程师在性能测试中遇到的共同困惑。最近在一次真实项目基准…

Codeforces Round 1058 (Div. 2) A~E

A - MEX Partition 思维? 求 \(a\) 的 \(\text{mex}\)。 关于证明,参考官方题解:首先,让 \(m=\operatorname{mex}(A)\) 。我们可以忽略所有大于 \(m\) 的元素。这是因为由于 \(m\) 是 mex, \(m\) 不会出现在 \(A\…

2025 年生料带厂家最新推荐排行榜:解析优质品牌优势,涵盖新型、彩色、液态等多类型生料带厂家企业推荐

在螺纹密封领域,生料带的质量与性能对家庭生活、工业生产的安全稳定至关重要。当前市场上,部分生料带密封性能差,导致家庭水管、燃气管道漏水漏气,引发资源浪费与安全隐患;工业场景中,许多产品耐温、耐腐蚀性不足…

openresty开发lua-resty-openssl之对称加密解密 - liuxm

openresty开发lua-resty-openssl之对称加密解密local cipher = require "resty.openssl.cipher" local rand = require "resty.openssl.rand" local pkey = require "resty.openssl.pkey&quo…

腾讯云 OpenCloudOS 8 docker安装

腾讯云 OpenCloudOS 8 docker安装腾讯云 OpenCloudOS 8 docker安装 1:更新系统sudo yum update -y2:安装依赖包sudo yum install -y yum-utils device-mapper-persisten-data lvm23:添加docker官方仓库sudo yum-confi…