尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

题解:AT_agc068_a [AGC068A] Circular Distance

题解:AT_agc068_a [AGC068A] Circular Distance
📅 发布时间:2026/6/22 1:36:31

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

题意:给出 \(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;
}

相关新闻

  • 用 OKHttp 和 Retrofit 打造稳如磐石的网络请求:连接池与重试机制的实战指南 - 教程
  • 电脑监控软件,后台监控,千里眼监控
  • go sync.pool 学习笔记

最新新闻

  • LlamaFactory数据处理管线深度解析:模板驱动的数据加载与packing优化
  • Ansible自动化部署LAMP+WordPress实战(Ubuntu 18.04)
  • 读普林斯顿计算机公开课02比特
  • 安防监控费用多少?华盛元亨为你详细说明 - myqiye
  • Laravel数据库迁移与填充器:实现可版本化配置的工程实践
  • WVP-GB28181-Pro技术架构深度解析:构建企业级视频监控统一接入平台的技术实施框架

日新闻

  • 2026速览惠州叛逆青少年学校前十大排名名单出炉 - 武汉中职最新信息发布
  • 2026上饶白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 天龙八部单机版终极数据管理工具:5个技巧快速掌握游戏数据编辑

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号