题目链接 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1131

【题目描述】
给出一段从A - B的区间S(A,B为整数),这段区间内的整数可以随便使用任意次。再给出一段从X - Y的区间T,问用区间S中的整数做加法,可以覆盖区间T中多少个不同的整数。
例如:区间S为8 - 10,区间T为3 - 20。在3 - 20中,整数8(8),9(9),10(10),16(8+8),17(8+9),18(9+9),19(9+10),20(10+10)。可以被区间S中的数覆盖,因此输出8。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000)
第2 - T + 1行:每行4个数:A, B , X, Y,中间用空格分隔。(1 <= A < B <= 10^18, 1 <= X < Y <= 10^18)
Output
输出共T行,每行1个数,区间[X,Y]中可以由A-B中的整数相加得到的不同整数的数量。
Input示例
1
8 10 3 20
Output示例
8

【思路】
在纸上画一画可以得到区间 [a,b][a,b][a,b] 可以覆盖的范围是 [ka,kb](k&gt;=1)[ka,kb](k&gt;=1)[ka,kb](k>=1)
随着 kkk 的不断增大,区间长度越来越大,最后区间之间会相互重叠,假设区间 [(k−1)a,(k−1)b][(k-1)a,(k-1)b][(k−1)a,(k−1)b] 和 [ka,kb][ka,kb][ka,kb] 发生重叠,那么一定有 (k−1)b&gt;=ka−1(k-1)b&gt;=ka-1(k−1)b>=ka−1 也就是 k&gt;=⌈b−1b−a⌉k&gt;=\lceil \frac{b-1}{b-a} \rceilk>=⌈b−ab−1​⌉,所以我们可以在一开始就计算出发生重叠的起始区间 kkk 是多少,然后从 (k−1)a(k-1)a(k−1)a 开始之后所有的点都可以覆盖到,然后按照 X,YX,YX,Y 的位置分类讨论

特别注意如果 Y&lt;aY&lt;aY<a 那么无解,如果 X&lt;aX&lt;aX<a 那么可以令 X=aX=aX=a

如果 X&gt;=(k−1)aX&gt;=(k-1)aX>=(k−1)a 那么 [X,Y][X,Y][X,Y] 可以完全被覆盖
如果 Y&lt;(k−1)aY&lt;(k-1)aY<(k−1)a 那么去计算 X,YX,YX,Y 所处在第几段,把它们所在段的部分答案加上,然后在加上它们之间的所有段的覆盖数量
如果 Y&gt;=(k−1)a,X&lt;(k−1)aY&gt;=(k-1)a,X&lt;(k-1)aY>=(k−1)a,X<(k−1)a 那么要计算 XXX 所在段一直到 (k−2)(k-2)(k−2) 段的答案,再加上最后一部分完全覆盖的答案

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;ll A,B,X,Y;ll calc(ll pos,bool& flag){//计算pos所处在第几段,如果flag为true说明pos在某段上,否则在某两端之间if(pos%B==0){flag=true;return pos/B;}else{ll p=pos/A,q=pos/B;if(p==q){ flag=false;return p+1; }else{ flag=true;return p; }}
}ll sum(ll k){//计算[a,b],[2a,2b],[3a,3b]...[ka,kb]一共有几个数,没有相互重叠ll ans=k*(k+1)/2*(A+B)+k;return max(ans,0LL);
}int main(){int T;scanf("%d",&T);while(T--){scanf("%lld%lld%lld%lld",&A,&B,&X,&Y);ll k=(B-1)/(B-A);if((B-1)%(B-A)!=0) ++k;if(Y<A){puts("0");continue;}if(X>=(k-1)*A){printf("%lld\n",Y-X+1);continue;}X=max(X,A);if(Y<(k-1)*A){bool flagx,flagy;ll px=calc(X,flagx);ll py=calc(Y,flagy);ll ans=0;if(flagx){ans+=px*B-X+1;++px;}if(flagy){ans+=Y-py*A+1;--py;}ans+=max(0LL,sum(py)-sum(px-1));printf("%lld\n",ans);}else{ll ans=Y-(k-1)*A+1;bool flagx;ll px=calc(X,flagx);if(flagx){ans+=px*B-X+1;++px;}ans+=max(0LL,sum(k-2)-sum(px-1));printf("%lld\n",ans);}}return 0;
}

转载于:https://www.cnblogs.com/wafish/p/10465138.html

51Nod 1131 - 覆盖数字的数量(分类讨论)相关推荐

  1. 模拟赛Day1(20200203) T1 垃圾题【分类讨论+枚举+dp解决等价匹配问题】

    题目描述: 题目分析: 看到bbb的长度为5,可以感觉到这题就是在锻炼强大合理的分类讨论能力. 首先看bi≤2b_i\le2bi​≤2的部分分,即只有两种数字. 枚举这两种数为x,yx,yx,y,数量 ...

  2. CF1471 D - Strange Definition(思维,分类讨论,lcm,gcd的性质,数论)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #694 (Div. 2) D 很好的一道数论思维题 D - Str ...

  3. uoj#246. 【UER #7】套路(dp+分块?分类讨论?)

    题目链接 分析: 目前为止我只能理解dp部分 我就喜欢这种单纯不做作的题目 一看名字就明白了这道题的本质 中二的题目描述 很显然,我们的关键就是求出最小相似度 朴素算法n^4 如果我们现在有一个权值数 ...

  4. Vasya and Multisets CodeForces - 1051C 模拟|分类讨论

    题意:把数组分成两个集合 每个集合中元素数量为1的个数相同(此个数可以是0) 分析: 这类问题就是要各种可能情况考虑到     然后分类讨论     完整地正确分类就AC     否则gg 如果数量为 ...

  5. 1749. 阻挡广告牌 II(分类讨论+区间合并)

    文章目录 Question Ideas Code Question 奶牛贝茜曾经从农场中向外看去,可以看到两个刊登着美味的牛饲料广告的广告牌,这令她非常满意. 不幸的是,其中一个广告牌最近已更新,现在 ...

  6. 分类讨论 ---- 2020 icpc 上海 Walker (二分 or 思维分类讨论)

    题目链接 题目大意: 就是两个人在坐标轴上面,有起始的坐标p1,p2p1,p2p1,p2,和速度v1,v2v1,v2v1,v2,问你访问完这长度为nnn的数轴最短时间是多少? 解题思路: 大佬有直接二 ...

  7. DL之CNN:自定义SimpleConvNet【3层,im2col优化】利用mnist数据集实现手写数字识别多分类训练来评估模型

    DL之CNN:自定义SimpleConvNet[3层,im2col优化]利用mnist数据集实现手写数字识别多分类训练来评估模型 目录 输出结果 设计思路 核心代码 更多输出 输出结果 设计思路 核心 ...

  8. Unfair contest 模拟-分类讨论

    题意 : 两人比赛,n个裁判,给分范围[1,h][1, h][1,h],去掉s个最高分和t个最低分,给出n - 1个裁判的给分,第n个裁判想让第1个人赢,并且最小化给1的分数a[n]a[n]a[n] ...

  9. 2020ICPC(上海) - Walker(分类讨论+二分)

    题目链接:点击查看 题目大意:在长度为 n 的数轴上给出两个人的初始位置和速度,问使得每个位置至少被一个人走过的时间是多少 题目分析:分类讨论题目,分四种情况讨论即可,设 p1 < p2: p1 ...

  10. 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

    [UOJ#33][UR #2]树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数. 考虑枚举lca,这个 ...

最新文章

  1. ASP.NET MVC4中调用WEB API的四个方法
  2. iOS自动化测试之Appium的安装和使用
  3. watch TV online for free
  4. 发布或重启线上服务时抖动问题解决方案
  5. 【微信小程序企业级开发教程】生命周期和app对象详解
  6. 安卓学习第17课——Gallery
  7. python3默认编码_python3的url编码和解码,自定义gbk、utf-8的例子
  8. struts通过Ajax返回数据时,例如对象类型,没有执行Ajax的回调函数
  9. 环形缓冲区实现类(Delphi)
  10. sql动态拼接<if>标签嵌套<foreach>判空、if失效等问题
  11. fieldset ----- 不常用的HTML标签
  12. Linux压缩文件与解压文件(*.zip)
  13. C# 无法识别的转义序列
  14. ccs软件linux安装,【图片】【吧主帖】在LINUX(ubuntu)系统下装CCSv6方法(原创)【dsp吧】_百度贴吧...
  15. CSS3 Transform 变形
  16. sql创建和添加时间字段
  17. flash用FlashPlayer将一个swf打包成exe
  18. 金融工程 | 远期与期货概述
  19. vi命令下编辑文件时,按insert键文件底部无法编辑
  20. 【AirSim】Windows下搭建AirSim

热门文章

  1. C++里面的LPBYTE是什么意思
  2. r语言算巢式设计方差分析_R语言进行方差分析
  3. work-conserving scheduling 是什么
  4. Kubernetes 小白学习笔记(1)--基本概念1
  5. vue element 调用后台下载文件
  6. asp 基础操作之增删改查
  7. eclipse接入hadoop-2.7.6集群(hadoop2.x版本通用),含免费资源
  8. 五、Linux常用命令——帮助命令
  9. Ubuntu 12.10方便操作套件
  10. vba取一列数中非0的行_vba excel怎么获取指定工作表的行数、列数