题解 GZOI2024D2B【乒乓球比赛】
4s, 512M
题目描述
Alice 和 Bob 在打乒乓球,乒乓球比赛的规则是这样的:一场比赛中两位选手将进行若干局比赛,选手只需要赢得
你作为 Alice 的朋友观战了他们的比赛,发现 Alice 赢了
输入格式
第一行两个正整数
输出格式
第一行一个正整数表示方案数。
样例
7 5
4
样例零中,
554 454
1226
数据范围
- 对于
的数据, 。 - 对于
的数据, 。 - 对于
的数据, 。 - 另外有
的数据, 。 - 对于
的数据, ,并请注意 均应为正整数。
solution
设 Bob 赢下了
观察到在
因为
对
Z = floor(Q / Y)
对于
对于
三次整除分块解决。先
Z = X - 1
对于
对于
对于
两个变量的地位等同,不妨:
后面这个部分,
以
所以
即
感受一下,尝试对
至此所有问题都解决了。时间复杂度
code
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr, ##__VA_ARGS__)
#else
#define endl "\n"
#define debug(...) void(0)
#endif
using LL = long long;
LL p, q, ret;
int main() {
#ifndef LOCAL
cin.tie(nullptr)->sync_with_stdio(false);
#endif
cin >> p >> q;
for (LL l = 1, r; l <= p; l = r + 1) {
LL z = q / l, pz1 = p + z - 1;
r = p / (p / l);
if (l <= pz1) r = min(r, pz1 / (pz1 / l));
if (z) r = min(r, q / z);
ret += (r - l + 1) * max(0ll, p / l - max(z + 1, pz1 / l + 1 - z) + 1);
}
for (LL l = 1, r; l <= min(p, q); l = r + 1) {
r = min(p, q) / (min(p, q) / l);
LL v = (max(p - 1, q) + l - 1) / (2 * l - 1);
if (v) r = min(r, (max(p - 1, q) + v - 1) / (2 * v - 1));
ret += (r - l + 1) * max(0ll, min(p, q) / l - v);
}
cout << ret << endl;
return 0;
}
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/18404167
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2023-09-09 题解 SS230909B【下落的小球】
2023-09-09 题解 SS230909A【数据恢复】