考场上切了,但是比较神奇的题,应该是蓝/紫

Discription

乒乓球 \(\text{ }\)时间限制:\(\bold{3}\) 秒

众所周知,一场乒乓球比赛共有两个玩家 \(A\) 和 \(B\) 参与,其中一场比赛由多局比赛组成,而每局比赛中又由多盘比赛组成。

每盘比赛 \(A\) 或 \(B\) 只有一名选手获胜。当其中一名选手在一局比赛中达到 \(X\) 盘比赛胜利时,该局比赛结束,并且该名选手被宣布为这局比赛的获胜者。

类似的,当其中一名选手在 \(Y\) 局比赛中获得胜利时,该名选手被称为该场游戏的获胜者。

你刚刚看了一场比赛,其中 \(A\) 获得了 \(P\) 盘比赛的胜利,B 获得了 \(Q\) 盘比赛的胜利,并且你知道 \(A\) 是该场比赛的获胜者,但你忘记了 \(X\) 和 \(Y\) 的具体数值。

你想知道有多少对可能的 \((X,Y)\),使得至少存在一组合法的获胜情况满足要求。

数据范围:\(0 \le P,Q \le 10^{14}\)。

Analysis

这个神奇的数据范围,加上计数,不难想到正解为整除分块,往这个方面想。

设 \(B\) 赢了 \(k\) 场,不难列出不等式组:

\[\begin{cases}
k \lt y & \textcircled{\small{1}}\\
xy \le p \le xy+k(x-1) & \textcircled{\small{2}}\\
kx \le q \le kx+y(x-1) & \textcircled{\small{3}}
\end{cases}\]

由 \(\textcircled{\small{1}}\) 和 \(\textcircled{\small{3}}\) 中 \(q\) 的下界知:

\[k \le \min(y-1,\lfloor\frac{q}{x}\rfloor)\text{ }\textcircled{\small{4}}
\]

这时候需要一点感性理解:

  1. 当 \(\textcircled{\small{4}}\) 时,\(\textcircled{\small{1}}\) 和 \(\textcircled{\small{3}}\) 中 \(q\) 的下界一定成立;
  2. 对于越大的 \(k\),\(\textcircled{\small{2}}\) 的下界不变,上界增大;
  3. \(\textcircled{\small{3}}\) 中区间长度与 \(k\) 无关,所以下界在 \(\le q\) 的前提下越大越好。

综上,\(k\) 越大越好,于是钦定:

\[k = \min(y-1,\lfloor\frac{q}{x}\rfloor)
\]

注意到此时可以调和级数 \(O(p\log p)\) 的枚举 \(x\) 和 \(y\) 同时 \(O(1)\) 检验,期望得分 \(50\) 分。


再想优化,就需要分类讨论:

$\bold{I.} $ 当 \(\lfloor\frac{q}{x}\rfloor \le y-1\) 时,

此时 \(k=\lfloor\frac{q}{x}\rfloor\)。

分析前面的不等式组:

  1. \(\textcircled{\small{1}}\) 和 \(\textcircled{\small{3}}\) 中 \(q\) 的下界一定成立;
  2. 对于 \(\textcircled{\small{3}}\) 中 \(q\) 的上界 \(kx+y(x-1)\),代入 \(k\) 得:
\[q \le \lfloor\frac{q}{x}\rfloor\cdot x+y(x-1)
\]

注意到 \(\lfloor\frac{q}{x}\rfloor\cdot x \gt q-x\),而 \(y \ge 1\) 即 \(y(x-1) \ge x-1\),于是 \(\textcircled{\small{3}}\) 恒成立。

综上,只需考虑 \(\textcircled{\small{2}}\) 和 \(\lfloor\frac{q}{x}\rfloor \le y-1\) 即 \(k\le y-1\) 的大前提即可。

\[\begin{cases}
k \le y-1\\
xy \le p \le xy+k(x-1) & \textcircled{\small{2}}\\
\end{cases}\]

考虑卡出 \(y\) 的范围,易得:

\[\max(k+1,\lceil\frac{p+k}{x}\rceil-k)\le y\le \lfloor\frac{p}{x}\rfloor
\]

改写一下向上取整:

\[\max(k+1,\lfloor\frac{p+k-1}{x}\rfloor+1-k)\le y\le \lfloor\frac{p}{x}\rfloor
\]

接着考虑怎么整除分块,比较好写的做法是:循环中先以 \(\lfloor\frac{p}{x}\rfloor\) 进行分块,算出 \(k\) 和 \(\lfloor\frac{p+k-1}{x}\rfloor\) 在对右端点 \(r\) 进行更新即可。

先放一下实现:

for(ll l=1,r;l<=p;l=r+1){
r=p/(p/l);
ll k=q/l,tmp=p+k-1;
if(k) r=min(r,q/k);
if(l<=tmp) r=min(r,tmp/(tmp/l));
ans+=(r-l+1)*max(p/l-max(k+1,tmp/l+1-k)+1,0ll);
}

$\bold{II.} $ 当 \(\lfloor\frac{q}{x}\rfloor \gt y-1\) 时,

此时 \(k=y-1\)。

类似的,分析原不等式组:

  1. \(\textcircled{\small{1}}\) 和 \(\textcircled{\small{3}}\) 中 \(q\) 的下界一定成立;
  2. 对于 \(\textcircled{\small{2}}\) 中 \(p\) 的下界 \(xy\),
\[\because \lfloor\frac{q}{x}\rfloor \gt y-1
\]
\[\therefore \lfloor\frac{q}{x}\rfloor \ge y
\]
\[\therefore \lfloor\frac{q}{x}\rfloor\cdot x \ge xy
\]
\[\therefore xy \le q
\]

于是 \(\textcircled{\small{2}}\) 中 \(p\) 的下界的限制必成立;

  1. 对于 \(\textcircled{\small{3}}\) 中 \(q\) 的下界 \(kx\),
\[\because y-1 \lt \lfloor\frac{q}{x}\rfloor\text{ }且\text{ }k=y-1
\]
\[\therefore k \lt \lfloor\frac{q}{x}\rfloor
\]
\[\therefore kx \lt \lfloor\frac{q}{x}\rfloor\cdot x
\]
\[\therefore kx \lt q
\]
\[\therefore kx \le q
\]

于是 \(\textcircled{\small{3}}\) 中 \(q\) 的下界的限制必成立;

综上,只需考虑 \(\textcircled{\small{2}}\) 和 \(\textcircled{\small{3}}\) 中的上界。

\(p.s.\) 大前提 \(\lfloor\frac{q}{x}\rfloor \gt y-1\) 在 2. 和 3. 中考虑过了,无需再考虑。

\[\begin{cases}
p \le xy+k(x-1) & \textcircled{\small{2}} & (上界)\\
q \le kx+y(x-1) & \textcircled{\small{3}} & (上界)
\end{cases}\]

将 \(k=y-1\) 代入得:

\[\begin{cases}
p \le 2xy-x-y+1 & \textcircled{\small{2}} & (上界)\\
q \le 2xy-x-y & \textcircled{\small{3}} & (上界)
\end{cases}\]

考虑卡出 \(2xy-x-y\) 的范围,易得:

\[2xy-x-y\ge \max(p-1,q)
\]

类似的,卡出 \(y\) 的范围,易得:

\[(2x-1)y\ge\max(p-1,q)+x
\]
\[\implies y \ge\lfloor\frac{x+\max(p-1,q)}{2x-1}\rfloor
\]

这个就好写很多,直接整除分块即可。

给出实现:

for(ll l=1,r;l<=min(p,q);l=r+1){
r=min(p,q)/(min(p,q)/l);
ll tmp=(max(p-1,q)+l-1)/(2*l-1));
if(tmp) r=min(r,(max(p-1,q)+tmp-1)/(2*tmp-1));
ans+=(r-l+1)*max(min(p,q)/l-tmp,0ll);
}

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll p,q,ans;
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>p>>q;
for(ll l=1,r;l<=p;l=r+1){
r=p/(p/l);
ll k=q/l,tmp=p+k-1;
if(k) r=min(r,q/k);
if(l<=tmp) r=min(r,tmp/(tmp/l));
ans+=(r-l+1)*max(p/l-max(k+1,tmp/l+1-k)+1,0ll);
}
for(ll l=1,r;l<=min(p,q);l=r+1){
r=min(p,q)/(min(p,q)/l);
ll tmp=(max(p-1,q)+l-1)/(2*l-1);
if(tmp) r=min(r,(max(p-1,q)+tmp-1)/(2*tmp-1));
ans+=(r-l+1)*max(min(p,q)/l-tmp,0ll);
}
cout<<ans<<endl;
return 0;
}

题解:GZOI2024 D2T2 乒乓球的更多相关文章

  1. 模拟、字符串--P1042 乒乓球 题解

    P1042 乒乓球 字符串string的基本使用 #include <iostream> #include <algorithm> #include <map> # ...

  2. 【题解】Luogu P5313 僕たちはひとつの光([Ynoi2012]D2T2)

    原题传送门 lovelive好评 比赛时只拿到了60pts,还是自己太菜了 这题的思想实际有点像Luogu P3674 小清新人渣的本愿与Luogu P5071 [Ynoi2015]此时此刻的光辉 这 ...

  3. 4560 NOIP2015 D2T2 子串

    4560 NOIP2015 D2T2 子串  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 有两 ...

  4. HDU2094(产生冠军)题解

    HDU2094(产生冠军)题解 以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 根据给定现有比赛结果推断分析冠军.(这描述...我建议还是看题吧,题不长) [题目分析] 给出的 ...

  5. HEOI2016 题解

    HEOI2016 题解 Q:为什么要在sdoi前做去年的heoi题 A:我省选药丸 http://cogs.pro/cogs/problem/index.php?key=heoi2016 D1T1 树 ...

  6. pkuwc2018题解

    题解: 思路挺好想的..然而今天写代码写成傻逼了 d1t1: 首先比较暴力的就是$f[i][j]$表示i个这个点是j的概率 然后前缀和一下dp就是$n^2$的 部分分树形态随机就说明树深度是$log$ ...

  7. HNOI2018简要题解

    HNOI2018简要题解 D1T1 寻宝游戏 题意 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为 ...

  8. BJOI2018简要题解

    BJOI2018简要题解 D1T1 二进制 题意 pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 \(3\) 的倍数.他想研究对于二进制,是否也有类似的性质. 于是他生 ...

  9. CQOI2018简要题解

    CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...

  10. NOIP2017 题解

    QAQ--由于没报上名并没能亲自去,自己切一切题聊以慰藉吧-- 可能等到省选的时候我就没有能力再不看题解自己切省选题了--辣鸡HZ毁我青春 D1T1 小凯的疑惑 地球人都会做,懒得写题解了-- D1T ...

随机推荐

  1. vim 插件汇总网站

    在网上找到了一个vim插件的汇总网站,上面有对vim插件进行汇总.简介.使用排名等,十分适合vim用户在上面寻找一些可用的插件. 网址: https://vimawesome.com/ 虽然我没有太用 ...

  2. baselines算法库common/retro_wrappers.py模块分析

    retro_wrappers.py模块代码: from collections import deque import cv2 cv2.ocl.setUseOpenCL(False) from .at ...

  3. baselines算法库baselines/common/input.py模块分析

    baselines算法库baselines/common/input.py模块代码: import numpy as np import tensorflow as tf from gym.space ...

  4. NVIDIA显卡的利用率“Volatile GPU Util"是什么???

    相关: CPU端多进程/多线程调用CUDA是否可以加速??? 如何实现nvidia显卡的cuda的多kernel并发执行??? ==================================== ...

  5. Committer 迎新!这次是来自阿里云的同学

    截至今天,Apache DolphinScheduler 项目在 GitHub 上的 Star 数已突破 10.6K,贡献者人数也突破了 470 人.社区的不断壮大,离不开每位 Contributor ...

  6. SeaTunnel 发布成为 Apache 顶级项目后首个版本 2.3.2,进一步提高 Zeta 引擎稳定性和易用性

    近日,Apache SeaTunnel 正式发布 2.3.2 版本.此时距离上一版本 2.3.1 发布已有两个多月,期间我们收集并根据用户和开发者的反馈,在 2.3.2 版本中对 SeaTunnel ...

  7. C#读写图片文件到Access数据库中

    今天学习了把图片文件读写到数据库中,我是用的Access数据库,SQL还没去测试,不过都差不多 数据库表的样式 练习嘛就随便弄了下,说明下图片转成的字符串要用备注类型才可以哦 如果用的Sql数据库的话 ...

  8. JAVA——instanceof运算符(问题待处理)

    2024/07/12 1.问题 2.问题拆解 3.解决 1.问题 今天学了一个运算符--instanceof,概念很抽象,感觉暂时理解不了,什么实例对象.类.子类,看得迷迷糊糊的,先记录下来,有空做一 ...

  9. canvas实现图片标记

    前言 由于业务需求,需要有一个图片标记功能,其实就是对图片画框画线做标记,类似微信的图片编辑 但是需要存下标记图及其标记的具体数据,.功能其实很简单,但刚开始的时候也是费了一些功夫的.我将原项目中该功 ...

  10. docker with GPU support

    自己总结的: nvidia-docker, 不支持windows,2019.10, nvidia-docker过时了,从docker 1903开始,安装一个nvidia-container-runti ...