P11626 [迷宫寻路 Round 3] 七连击 分析

news/2025/11/20 21:47:00/文章来源:https://www.cnblogs.com/high-sky/p/19249650

题目概述

有一个长度为 \(n\) 的序列,将这个序列砍 \(7\) 刀,分成了 \(8\) 个部分,取前 \(7\) 个部分进行讨论。

对于每个部分,贡献为这一段的最大公约数。

求所有情况的贡献和并对 \(998244353\) 取模。

数据范围:\(1\leq n\leq 10^5,0\leq a_i\leq 10^9\)

分析

真服了,那个 \(a_i=0\) 直接耗了我好久,看了 \(60\) 分求调代码的那个贴子才恍然大悟,而且那个贴子下面有数据。

不知道为什么你们一眼看到的就是动态规划,本蒟蒻只会组合计数的方法。

首先不难想到把无关项提到前面去,那么通过这个不难得出来我们需要知道一个区间在第 \(k(1\leq k\leq 7)\) 个块时对答案的贡献。

也就是说我们枚举这个区间和它在第几个块,组合数计算就行了。

对于 \(k=1\) 我是特殊处理的。

考虑 \(k\geq 2\) 的情况,你这里可能需要注意一下枚举区间的范围。

由于我们枚举出了这个区间(假设为 \([i,j]\))以及知道它在第几个块,那么我们可以把它对答案的贡献系数分成左边分成 \(k-1\) 块的方案以及剩下的部分分成其它块的答案。

考虑左边的,由于已经枚举了左端点,所以就是算切了一刀,于是左边的贡献就是 \(\binom{i-2}{k-2}\),因为只有 \(i-1\) 个数最右边还被切过了,因此只剩下 \(i-2\) 个空给 \(k-2\) 次切的机会。

考虑右边的,十分类似,但是这里我们没有多切一刀,因为你可以看作这个是属于前面的,因此右边的贡献就是 \(\binom{n-j}{7-k}\)

于是我们的答案实际上就是(\(k=1\) 特殊讨论):

\[\sum_{k=2}^7\sum_{i=k}^{n-(7-k)}\sum_{j=i}^{n-(7-k)}\binom{i-2}{k-2}\binom{n-j}{7-k}\gcd_{x=i}^jA_x \]

于是得到了我们的 \(\mathcal{O}(7n^2)\) 代码:

int ans = 0;
int t = 0;
for (int i = 1;i <= n - 6;i ++) {t = gcd(t,a[i]);int rest = n - i;ans = (ans + C(rest,6) * t % mod) % mod;
}
for (int k = 2;k <= 7;k ++)for (int i = k;i <= n - (7 - k);i ++) {int t = 0;for (int j = i;j <= n - (7 - k);j ++) {t = gcd(t,a[j]);ans = (ans + C(i - 2,k - 2) * C(n - j,7 - k) % mod * t % mod) % mod;}}

很短,但是可以拿 \(40\) 分。

接下来考虑优化,我们注意到我们的 \(j\) 右移的时候这个当前的最大公约数是单调不增的,而且相同的部分一定是一段一段的。

而且有一个经典的结论就是:前缀(或者是后缀)的最大公约数的种类个数是 \(\mathcal{O}(\log V)\) 级别的,其中 \(V\) 是值域。

这个证明也很简单,因为你加进来一个数求最大公约数的时候至少是减半的。

也就是说我们不需要枚举 \(j\),我们只需要得到这一段一段的为相同最大公约数的区间即可,直接计算就行。

我这里采用了二分找位置,时间复杂度可能有点大,区间求最大公约数可以直接用ST表维护即可。

不知道Erine怎么做到少一个 \(\log\) 的,本蒟蒻不会。

代码

时间复杂度 \(\mathcal{O}(n\log n\log V)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#define int long long
#define N 100005
using namespace std;
const int mod = 998244353;
int gcd(int a,int b) {return b ? gcd(b,a % b) : a;
}
int jc[N],inv[N],lg[N];
int C(int a,int b) {if (a < 0 || b < 0 || a < b) return 0;return jc[a] * inv[b] % mod * inv[a - b] % mod;
}
int st[N][23];
int query(int l,int r) {int k = lg[r - l + 1];return gcd(st[l][k],st[r - (1 << k) + 1][k]);
}
int n,a[N],sum[8][N];
signed main(){for (int i = 2;i < N;i ++) lg[i] = lg[i >> 1] + 1;jc[0] = jc[1] = inv[0] = inv[1] = 1;for (int i = 2;i < N;i ++) jc[i] = jc[i - 1] * i % mod,inv[i] = (mod - mod / i) * inv[mod % i] % mod;for (int i = 2;i < N;i ++) inv[i] = inv[i - 1] * inv[i] % mod;cin >> n;for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]),st[i][0] = a[i];for (int j = 1;(1 << j) <= n;j ++)for (int i = 1;i + (1 << j) - 1 <= n;i ++)st[i][j] = gcd(st[i][j - 1],st[i + (1 << j - 1)][j - 1]);int ans = 0;int t = 0;for (int i = 1;i <= n - 6;i ++) {t = gcd(t,a[i]);int rest = n - i;ans = (ans + C(rest,6) * t % mod) % mod;}for (int k = 2;k <= 7;k ++) {sum[k][0] = C(0,7 - k);for (int i = 1;i <= n;i ++) sum[k][i] = (sum[k][i - 1] + C(i,7 - k)) % mod;}for (int k = 2;k <= 7;k ++)for (int i = k;i <= n - (7 - k);i ++) {int now = a[i];int l = i;for (;l <= n && a[l] == 0;l ++);now = a[l];int r = n - (7 - k),res = l - 1,tot = 0;int xs1 = C(i - 2,k - 2);while(res < n - (7 - k)) {int lst = res + 1;l = res + 1,r = n - (7 - k),res = l;while(l <= r) {int mid = l + r >> 1;if (query(i,mid) >= now) l = mid + 1,res = mid;else r = mid - 1;}tot = (tot + now * (sum[k][n - lst] - (n - res - 1 >= 0 ? sum[k][n - res - 1] : 0) + mod) % mod) % mod;now = query(i,res + 1);}ans = (ans + tot * xs1 % mod) % mod;}cout << ans;return 0;
}

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

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

相关文章

芯谷科技--高性能电动工具直流调速电路GS069 - 指南

芯谷科技--高性能电动工具直流调速电路GS069 - 指南2025-11-20 21:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

【个人成长笔记】在本地Windows系统中如何正确使用adb pull命令,把Linux环境中的记录或文件夹复制到本地中(亲测有效)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

钩子

钩子(Hook)的核心概念是:在特定时刻被自动调用的函数,允许你在“某个流程”中插入自定义代码。 具体来说有两种层面的理解:框架层面的生命周期钩子:这是 Vue 框架为组件生命周期中固定节点(如创建、挂载、更新、…

IOI 2026 中国国家集训队作业(试题泛做)记录

IOI 2026 中国国家集训队作业(试题泛做)跟着学长做。可能不是很详细。 qoj1875 Nein link qoj970 Best Subsequence 考虑单次询问怎么做。二分,设 \(\le W\) 的为一类数,其余为二类数,显然二类数不能相邻,则肯定…

洛谷 B4411:[GESP202509 二级] 优美的数字 ← 嵌套循环

​【题目来源】https://www.luogu.com.cn/problem/B4411【题目描述】如果一个正整数在十进制下的所有数位都相同,小 A 就会觉得这个正整数很优美。例如,正整数 6 的数位都是 6,所以 6 是优美的。正整数 99 的数位都…

2025年门窗十大品牌专业选购手册:行业评估报告 + 白皮书指引,选窗更安心!

2025 年度门窗十大品牌的筛选与推荐,以中国建筑金属结构协会重磅发布的《2025 年度建筑门窗行业发展评估报告》为核心依据,深度拆解报告中关于行业技术革新趋势、品牌综合实力排名、产品核心性能基准值等关键内容,将…

文字识别系统

import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset import os from PIL import Image import torchvision.transforms as transforms import numpy …

2025 门窗十大品牌精准选购指南:行业评估报告 + 白皮书护航,选窗不踩坑!

2025 年度门窗十大品牌的筛选工作,以中国建筑金属结构协会正式发布的《2025 年度建筑门窗行业发展评估报告》为核心根基,深度挖掘报告中关于行业技术迭代方向、品牌综合竞争力评级、产品核心性能基准参数等关键信息,…

写的都对_第二次软件工程作业

第二次软件工程作业 一、格式描述作业所属课程 软件工程 班级的链接 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering作业要求 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homewor…

深入解析:spark组件-spark core(批处理)-rdd血缘

深入解析:spark组件-spark core(批处理)-rdd血缘pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

深入解析:开源 Linux 服务器与中间件(十二)FRP内网穿透应用

深入解析:开源 Linux 服务器与中间件(十二)FRP内网穿透应用2025-11-20 21:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

CF1542E1 Abnormal Permutation Pairs (easy version)

我们不妨想一个简单的问题,如何计算一个长度为 \(n\) 的排列且逆序对个数为 \(m\) 的方案数。 令 \(f_{i, j}\) 为长度为 \(i\) 的排列逆序对个数为 \(j\) 的方案数。 我们转移的时候,本质上可以任选最后一个数到底增…

网络流建模

网络流建模 最大流 多源多汇 如果一道题中有多个可行的源点 \(s_1,\ldots,s_a\) 和多个可行的汇点 \(t_1,\ldots,t_b\),那么可以建立超级源汇 \(S,T\),从 \(S\) 向 \(s_i\) 连容量无穷的边,\(t_i\) 向 \(T\) 连容量…

实用指南:GLM 智能助力・Trae 跨端个人任务清单

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AT_agc050 总结

久违地发一次考试总结。因为这次写的比较详细,勉强能拿出来看看。 A 第一反应是线段树。(其实按位考虑说不定对于某些题也是一种突破口) 正解是连 \((2*p)-1\bmod n+1)\) 和 \((2*p+1)-1\bmod n+1\) 然后发现对于每…

补 二分法与图

题目:洛谷p1462 只要某个性质具有单调性,就必然可以二分。 以最短路为判断条件,二分费用,只允许使用费用小于等于目前费用的节点,求最短路,看是否可行,再根据可行性二分费用,最后求出费用的最小值 K 越大,可行…

SpringSecurity 集成 CAS Client 处理单点登录 - Higurashi

推荐阅读:CAS 单点登录详细流程背景 当前业务系统基于 Spring Security,现在需要集成 CAS,当用户访问业务系统时,如果用户没有登录,则跳转到 CAS Server 统一登录页面完成登录。 而当用户从 CAS Server 退出登录后…

NOIP2025模拟赛12(炼石计划NOIP模拟赛第 19 套题目)

赤了这口魔拟赛的石!写在前面: 我艹了何意味啊何意味T1放依托定理的板子题然后我还没听过这个定理(虽然据说是数论基础四大定理之一,但是好像学习数论基础的时候根本没看到过这个定理也没做过相关的题😡😡😡…

[nanoGPT] GPT模型架构 | `LayerNorm` | `CausalSelfAttention` |`MLP` | `Block` - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

duckdb索引介绍

duckdb支持的索引类型 duckdb支持两种索引:Min-Max Index (Zonemap)和Adaptive Radix Tree (ART)。前者所有通用数据类型(general-purpose data types,也就是常用的数据类型如varchar/integer/date等,非通用类型指的…