做题随笔:P3403

news/2025/11/18 20:39:22/文章来源:https://www.cnblogs.com/Tenil/p/19239252

Solution

这里给出了一种不使用最短路的优化算法,可以优化到 \(O(x)\),而且出奇的直观、好写。同见于 oi-wiki。(其实相关部分是我写的)

题意

原题链接

给定 \(x,y,z,h\),求 \(ax+by+cz=h\) 的非负整数解 \((a,b,c)\) 的组数。

分析

不妨设 \(x \leq y \leq z\),我们有一个自然的思路:设 \(d_i\) 表示只通过 \(+y\)\(+z\) 可以在模 \(x\) 意义下构造的最小值,因为 \(d_i+kx\) 都可以由 \(d_i\) 直接构造,有了 \(d_i\),求出方案数是简单的。

那么我们就有一个最短路的思路:\(d_i\) 可以用来更新 \(d_{i+y \bmod x}\)\(d_{i+z \bmod x}\),以 \(y\) 更新为例,我们有 \(d_{i+y \bmod x} \gets \min(d_{i+y \bmod x},d_i+y)\),于是我们可以直接建图愉快 dijkstra。\(O(x \log x)\)

但是,我们有惊人的洞察:

  1. 我们 dijkstra 的过程就是尝试使用当前的 \(d_i\) 加一个 \(y\)\(z\) 进行拓展。加法具有交换律,所以我们可以先只进行 \(y\) 的松弛,再进行 \(z\) 的松弛。放到图上就是我可以先走一类边,再走另一类边。
  2. 如果我们只建出一类边,建出来的图会是若干个不交、等长的环。

第一个发现是自然的,第二个可能不太自然,证明如下:

\(d=\gcd(x,y)\),设 \(x=da,y=db\),有 \(\gcd(a,b)=1\)

考虑从 \(u\) 出发走 \(k\) 步,到达 \((u+ky) \bmod x\)。若成环,则 \(ky \equiv 0 \pmod x\),即有 \(kb \equiv 0 \pmod a\)

由于 \(\gcd(a,b)=1\),最小的 \(k=a\),即环长为 \(a = \dfrac{x}{d}\)。由于是从任意点开始,故每个可能的环长相等,环的数量为 \(d\)

那么证明了图上只有环有什么用呢?先说结论:在环上求 \(d_i\) 只需要绕环转两圈即可。这个结论是平凡的:最小值不可能被更新,我们其实只需要从最小值出发绕一圈就行。从任意点开始绕两圈就可以保证一定用最小值跑了一圈。

那就很爽了,我们只需对两种边分别跑一下就行,不用建图,不用写最短路,直接 for 一下就行。

\(O(x)\)

Code

为了便于理解,实现的时候用 vector 把环存了一下,事实上根本不必要,直接记一个 vis,等于 2 就 break。

#include <iostream>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <climits>
#include <algorithm>
#include <vector>typedef long long ll;ll fr() {ll x = 0, f = 1;char c = getchar();while (!isdigit(c)) {if (c == '-') f = -1;c = getchar();}while (isdigit(c)) {x = (x << 3) + (x << 1) + (c ^ 48);c = getchar();}return x * f;
}const int maxn = 1e5+100;ll d[maxn];
bool vis[maxn];
ll ans;int gcd(int a,int b) {return b?gcd(b,a%b):a;
}void upd(int step,int M) {int D=gcd(step,M);int len=M/D;for (int st = 0; st < D; st++) {if (vis[st]) continue;std::vector<int> v;int u=st;for (int i = 0; i < len; i++) {v.push_back(u);vis[u]=true;u=(u+step)%M;}for (int r = 0; r < 2; r++) {for (int i = 0; i < len; i++) {int las=v[i];int now=v[(i+1)%len];if (d[las]!=LLONG_MAX) d[now]=std::min(d[now],d[las]+step);}}}
}int main() {ll h = fr();int x[3];for (int i = 0; i < 3; i++) x[i]=fr();std::sort(x,x+3);int M=x[0];for (int i = 0; i < M; i++) d[i]=LLONG_MAX;d[0]=0;upd(x[1],M);memset(vis,0,sizeof(vis));upd(x[2],M);ll H=h-1;ans=0;for (int i = 0; i < M; i++) {if (d[i]<=H&&d[i]!=LLONG_MAX) {ans+=(H-d[i])/M+1;}}printf("%lld\n",ans);return 0;
}

一些闲话

如果觉得有用,点个赞吧!

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

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

相关文章

2025.11.18

今天上课,拿快递,吃饭,睡觉,买水果,回宿舍。

《从纪律委员到AI元人文开放者》

《从纪律委员到AI元人文开放者》 作者:岐金兰 日期:2025年11月18日 三十年前,我站在教室的讲台上,手里拿着纪律记录本。那时的我,是班级秩序的守护者,用稚嫩的肩膀承担着维持纪律的责任。谁能想到,三十年后,我…

MEMS与CMOS的3D集成技术研究进展 - 指南

MEMS与CMOS的3D集成技术研究进展 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

CSS学习笔记(六):CSS预处理器 - 实践

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

「Solution」AGC008F Black Radius

大战 6h 看题解天塌了。很好玩的题目!没有想到题解区做法,这里给一个鏖战许久的容斥做法。由于写的太多所以单独成篇了。 这个关键点、距离等限制有一种 [十二省联考 2019] 希望 的既视感(虽然这个题更早)。直接算…

linux c web

您提到的“Linux C web”可能有多种含义,以下是几种可能的解释和相关建议:1. Linux 内核开发(C 语言) 如果您是在 Linux 内核开发中使用 C 语言,以下是一些常用命令和工具: 常用命令:gcc:编译 C 代码gcc -o my…

2025 年 钢丝网/钢骨架 塑料复合管厂家权威推荐榜/哪家好/有实力/可靠的/排名企业-江苏狼博管道制造有限公司

2025 年 钢丝网/钢骨架 塑料复合管厂家权威推荐榜/哪家好/有实力/可靠的/排名企业-江苏狼博管道制造有限公司** 2025 年 钢丝网/钢骨架 塑料复合管厂家权威推荐榜**钢骨架塑料复合管 钢丝网骨架塑料复合管 钢骨架聚乙…

CSS实现修改CheckBox样式

CSS实现修改CheckBox样式checkbox的代码:<div><input type="checkbox" id="custom-checkbox" class="custom-checkbox"><label for="custom-checkbox">&l…

人工智能之编程进阶 Python高级:第二章 面向对象

人工智能之编程进阶 Python高级:第二章 面向对象人工智能之编程进阶 Python高级 第二章 面向对象@目录人工智能之编程进阶 Python高级前言一、面向对象核心概念二、定义类和创建对象1. 基本语法2. __init__ 方法三、封…

OI vs Group Theory, Do You Guys Know?

TBD作者:ShaoJia,欢迎分享本文,转载时敬请注明原文来源链接。

2025年11月穿戴式吸奶器,电动吸奶器,百元吸奶器品牌测评排名,高性价比选购指南!

2025年11月穿戴式吸奶器、电动吸奶器、百元吸奶器品牌测评排名与高性价比选购指南在2025年11月,市面上的吸奶器产品琳琅满目,对于众多孕产妈妈来说,如何挑选到一款高性价比的吸奶器成为了一大难题。今天,我们就来重…

2025年11月百元吸奶器,静音吸奶器,便携吸奶器品牌测评排名,高性价比选购指南!

2025年11月百元吸奶器选购指南:聚焦卡乐怡等优质品牌在2025年11月,如果您正在为选择一款合适的吸奶器而烦恼,那么这篇测评排名及选购指南将为您提供有价值的参考。在众多吸奶器品牌中,卡乐怡品牌隶属的汕头市汇亨淇…

Q:R2R(Row-to-Row)映射 XML 是数据同步“源表字段→目标表字段” 的转换规则基础教程。

Q:R2R(Row-to-Row)映射 XML 是数据同步“源表字段→目标表字段” 的转换规则基础教程。Posted on 2025-11-18 20:26 三年三班王小朋 阅读(0) 评论(0) 收藏 举报R2R 映射 XML 语法速查表 一、核心节点层级(必记…

2025年11月免手扶吸奶器,穿戴式吸奶器,百元吸奶器品牌测评排名,清洁便捷优选!

2025 年 11 月免手扶吸奶器,穿戴式吸奶器,百元吸奶器品牌测评排名,清洁便捷优选!在母婴市场中,吸奶器是众多妈妈们的刚需产品。随着科技的发展,免手扶吸奶器、穿戴式吸奶器等新型产品不断涌现,为妈妈们带来了更…

【Azure Developer】解决在中国区 Microsoft Graph 命令Get-MgUserAuthenticationPhoneMethod 不可用的问题

问题描述 使用PowerShell Microsoft Graph 命令来获取用户认证的电话信息时,发现 Get-MgUserAuthenticationPhoneMethod 命令在中国区 Azure上不可用。报错:Get-MgUserAuthenticationPhoneMethod : Resource not fo…

基于Redis的滑动窗口限流-Golang实现

基于Redis实现滑动窗口限流,分析不使用lua时的并发问题常用限流算法 包括固定窗口、滑动窗口、令牌桶、漏桶 固定窗口: 将时间划分为固定长度的窗口(如 1 秒),窗口内维护请求计数,当请求数超过阈值时拒绝新请求。…

查看laya已经加载的资源

查看laya已经加载的资源Laya.Loader.loadedMap 不是Laya.loader, loadedMap是static的, 在Loader类中定义的.

ESP32 + LVGL 开发笔记(一):点亮屏幕

折腾了几天 lvgl,打算写一个简单的教程来记录一下。教程的最后会实现一下使用 lvgl 显示 lottie 动画的效果,见下图:环境介绍 硬件:esp32s3 n16r8核心板 1.47寸 ips lcd彩色屏幕(st7789)分辨率320 x 172,没有触屏…

聊聊deepseek对latex的辅助

聊聊deepseek对latex的辅助最近两天,用deepseek辅助latex写了一篇20页的反串讲文档,感觉结构清晰,且格式工整,一目了然。 很感慨的一点是,最开始的时候,是大学毕业论文时使用latex,当时就想着自己不用考虑work的…

【LVGL】图片部件

引言 图片部件(lv_img)图片部件相关 api 函数图片转换 LVGL 中要显示图片则需要 C 语言,或者 bin 的方式, 恰好 LVGL 官网提供了一个很好的在线工具:图像转换器 不过要注意的是选择自己当前的 LVGL 版本,下面是我…