题解:AT_agc068_a [AGC068A] Circular Distance

news/2025/11/9 18:55:58/文章来源:https://www.cnblogs.com/LUlululu1616/p/19204697

牛牛题,看了很多次才看懂

题意:给出 \(L,n\),问在一个 \(L\) 长的环上,放置 \(n\) 个点,定义两点距离为两种路径中长度较短的长度,问所有放置方式的点的距离最大值之和。

做法:

首先先强制选定 \(0\) 号点,最后将答案乘上 \(\frac{L}{n}\) 即可,因为其可以作为 \(L\) 个点中的任何一个。

然后考虑如何计算答案。最大值等于 \(l\) 的比较难算,我们考虑差分一下,改成小于等于 \(l\) 的减去小于 \(l\) 的。

考虑怎么计算距离小于等于 \(l\) 的,因为我选了 \(0\),所以对于 \([1,l]\) 的和 \([L-l,L-1]\) 内的都可以选,\([l+1,L-l-1]\) 内都不可选。我记 \(len=L-2l-2\)。注意到这两个可选区间内的点都可以随便选,主要是两部分之间的限制相当麻烦。

我们称 \([1,l]\) 内的点为白点,\([L-l,L-1]\) 的点为黑点。手玩一下 \([L-l,L-1]\) 这些点会 ban 掉的区间,会发现,\(L-x\) 会 ban 掉 \([l+1-x,L-l-1-x]\) 也是一个长度为 \(len\) 的区间平移一下。我们把这些 ban 掉的区间只考虑对 \([1,l]\) 的影响,发现应该是若干个重叠的 \(len\) 长区间,最后的若干位置会叠出去,但是我们也只取 \([1,l]\) 的部分。

那么注意到我有一个黑色点的连续区间,那么映射在白色这边,就会是一段连续的黑色点区间,然后要求后面连续 \(len\) 个点被 ban 掉不能被选。

那么我们考虑有多少个除去到 \(l\) 的黑色连续段,记个数为 \(j\),为什么除去 \(l\) 因为最后一个连续段不必要禁掉一个长度为 \(len\) 的区间,有一个我们就至少需要禁掉 \(len\) 长的区间不能被选。我们考虑选出来哪些点,那么这样会有 \(l-len\times j\) 可以被选,从中任意选 \(n-1\) 个点作为黑白点选出来,方案数为 \(\binom{l-len\times j}{n-1}\)

然后我们考虑具体确定黑白点情况,那么我考虑把第一个点 \(0\) 当成白点放到最前,同时因为最后还有一个黑色连续段,加入最后有个黑点,所以总共有 \(n+1\) 个点。然后考虑我要分成多少个段,应该是 \(2j+2\) 个段,那么方案数就为 \(\binom{n}{2j+1}\)

乘起来就可以得到答案。注意 \(l=\frac{n}{2}\) 可以直接计算,答案为 \(\binom{L-1}{n-1}\)。直接计算即可。

复杂度瓶颈在于我需要枚举 \(len\) 的倍数,复杂度 \(O(L\log L)\)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e6 + 5, mod = 998244353;
int jc[maxn], revjc[maxn], n, m;
int C(int m, int n) {if(m < 0 || n < 0 || m < n)return 0;return jc[m] * revjc[n] % mod * revjc[m - n] % mod;
}
void prepare() {jc[0] = 1;for (int i = 1; i <= n; i++)jc[i] = jc[i - 1] * i % mod;revjc[0] = revjc[1] = 1;for (int i = 2; i <= n; i++)revjc[i] = (mod - mod / i) * revjc[mod % i] % mod;for (int i = 2; i <= n; i++)revjc[i] = revjc[i] * revjc[i - 1] % mod;
}
int d[maxn];
signed main() {cin >> n >> m;prepare();for (int i = 1; i < n / 2; i++) {int l = n - 2 * i - 2;int ans = 0;for (int j = 0; i - l * j >= m - 1 && 2 * j + 1 <= m; j++)ans = (ans + C(i - l * j, m - 1) * C(m, 2 * j + 1) % mod) % mod;d[i] = ans;}int ans = 0;d[n / 2] = C(n - 1, m - 1);for (int i = 1; i <= n / 2; i++) ans = (ans + (d[i] - d[i - 1] + mod) * i) % mod;cout << ans * n % mod * revjc[m] % mod * jc[m - 1] % mod << endl;return 0;
}

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

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

相关文章

P14461 题解

消一消元: \[\begin{aligned}F_i&= G_{i - 1} + G_{i - 1} \\&= F_{i - 2} - F_{i - 2} + F_{i - 2} - F_{i - 2} \\&= F_{i - 2} - F_{i - 2} \end{aligned} \]类似的: \[G_i = G_{i - 2} - G_{i - 2} …

Nim 游戏与 SG 函数

已完成今日《Nim 游戏与 SG 函数》大学习。 本文比较基础,并未涉及到各种各样的 Nim 游戏,因为笔者比较菜。 1. 公平组合游戏 定义一个游戏为公平组合游戏,当且仅当:双方都知道当前局面的所有信息。 每一步的操作与…

题解:Luogu P11114 [ROI 2024] 小推车 (Day 1)

题意 有一排编号为 \(1\sim n\) 的座位。有 \(k\) 种饮料,第 \(i\) 名乘客想要喝第 \(a_i\) 种饮料。小推车需要从 \(0\) 位置出发,最终走到 \(n+1\) 位置,按顺序给每名乘客分饮料。推车上有 \(m\) 个瓶子,每个瓶子…

摸鱼笔记[1]-windows设置双网卡优先级(跃点数)

windows系统通过设置跃点数以设置双网卡优先级, 实现工控局域网网卡和互联网网卡各司其职, 电脑同时访问局域网和互联网.摘要 windows系统通过设置跃点数以设置双网卡优先级, 实现工控局域网网卡和互联网网卡各司其职,…

NXP - 用MDK建立基于arm-none-eabi软件链的工程框架

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

用 OKHttp 和 Retrofit 打造稳如磐石的网络请求:连接池与重试机制的实战指南 - 教程

用 OKHttp 和 Retrofit 打造稳如磐石的网络请求:连接池与重试机制的实战指南 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

数字孪生重构智慧园区:众趣科技何以成为 VR 园区领域标杆 - 实践

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

电脑监控软件,后台监控,千里眼监控

电脑监控软件,后台监控,适合家庭电脑、员工电脑监控 支持异地远程访问,终身授权最低100R,可月付年付 不限设备数量,支持win7、10、11 1、电脑位置显示 2、桌面远程观看 3、桌面文件下载 4、完整记录按键输入 5、智…

【URP】Unity[后处理]运动模糊MotionBlur

Motion Blur 概念与作用 Motion Blur(运动模糊)是一种模拟真实相机在拍摄快速移动物体或自身移动时产生的模糊效果的后处理技术。它通过模糊图像中运动物体的轨迹,增强动态场景的真实感和【从UnityURP开始探索游戏渲…

go sync.pool 学习笔记

概述 sync.pool 对象池可以用来复用临时对象,减少内存压力,降低 GC 压力。 示例 基本用法 type Worker struct{} func (w *Worker) Name() string { return "worker" } func main() { workerPool :…

初识分布式训练

假设有N块GPU,模型有ψ个参数。 前提知识:每个参数对应一个梯度值,且SGD每个参数对应一个一阶动量,Adam每个参数对应一个一阶、一个二阶动量DP(data parallel) ​ 数据并行(单进程,多线程,只用一个cpu核),每…

电脑监控软件,后台监控,适合家庭电脑、员工电脑监控

电脑监控软件,后台监控,适合家庭电脑、员工电脑监控 支持异地远程访问,终身授权,可月付年付 不限设备数量,支持win7、10、11 1、电脑位置显示 2、桌面远程观看 3、桌面文件下载 4、完整记录按键输入 5、智能屏幕快…

题解:P10856 【MX-X2-T5】「Cfz Round 4」Xor-Forces

题解 首先,我们先考虑简单的情况,没有修改操作。 由题意得,一段区间颜色段个数可以转化为区间长度减去相邻同色个数,即区间 \([l,r]\) 的颜色段数为 \(r-l+1- \sum^r_{i=l+1}[a_i=a_{i-1}]\)。 考虑线段树,那么一…

python: Virtualenv的安装与应用

一,安装Virtualenv 以ubuntu为例: 安装pip # apt install python3-pip 安装virtualenv # apt install python3-virtualenv二,创建环境 $ virtualenv -p /usr/bin/python3.12 myenv 三,进入/退出 环境 进入 $ sourc…

题解:AT_abc147_f [ABC147F] Sum Difference

题意 在一个等差数列中取出若干个元素,求取出的元素与未取出的元素的差值有多少种可能。 思路 首先,我们有一个式子: \[w(i)=\sum_{i \in S}A_i-\sum_{i \notin S}A_i \]不难看出,该式可以变为: \[w(i)=2\times \…

20231326《密码系统设计》第八周预习报告

20231326《密码系统设计》第八周预习报告 目录20231326《密码系统设计》第八周预习报告学习内容《Windows C/C++加密解密实战》第 12 章1. 什么是 SSL 协议 (Secure Sockets Layer)2. SSL/TLS 协议发展历程3. SSL v3/T…

PERL Docker 容器化部署指南

PERL(Practical Extraction and Reporting Language)是一种高级、通用、解释型、动态编程语言,其语法借鉴了C、Shell脚本、AWK和sed等多种语言特性,广泛应用于系统管理、Web开发、网络编程等领域。通过Docker容器化…

解放双手!使用Roslyn生成代码让你的 HTTP 客户端开发变得如此简单

在现代 .NET 开发中,源代码生成器(Source Generators)是一项强大的功能,它允许开发者在编译时自动生成代码,从而减少样板代码的编写,提高开发效率和代码质量。本文主要介绍使用Roslyn实现两个代码生成器:HttpCl…

pandoc用法

要将你的 `文件V5.0_2.docx` 文件转换为 Markdown 格式,使用 **Pandoc** 是一个非常直接的选择。我已经为你准备好了相应的命令,并补充了一些实用技巧。 ### 📝 核心转换命令 在终端或命令行中,导航到你的 `.docx…

JMeter:性能测试利器全解析 - 实践

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