【SSL_2020.10.27】小biu闯关
发布日期:2021-05-06 16:01:02 浏览次数:17 分类:精选文章

本文共 1023 字,大约阅读时间需要 3 分钟。

小biu~闯关


在这里插入图片描述

蛶磃糹樐(解题思路)

首先,我们要知道一个东西:

[ A , B ]    ⟹    [ 2 A , 2 B ]    ⟹    [ K A , K B ] [A,B] \implies [2A,2B] \implies [KA,KB] [A,B][2A,2B][KA,KB]
那么这是为什么呢?以样例为例:
[ 8 , 10 ] = 8 , 9 , 10 [8,10]=8,9,10 [8,10]=8,9,10
8 + 8 = 16 , 8 + 9 = 17 , 9 + 9 = 10 , 9 + 10 = 20 8+8=16,8+9=17,9+9=10,9+10=20 8+8=16,8+9=17,9+9=10,9+10=20
= [ 16 , 20 ] = [ 2 ∗ 8 , 2 ∗ 10 ] =[16,20]=[2*8,2*10] =[16,20]=[28,210]
然后呢,我们又要知道另一个东西: ∵ a < b \because a<b a<b ∴ b − a > 0 \therefore b-a>0 ba>0 ∴ k b − k a 单 调 递 增 \therefore kb-ka单调递增 kbka ∴ ( k + 1 ) a − k b 单 调 递 减 \therefore (k+1)a-kb 单调递减 (k+1)akb
那么区间总有一天会重合,我们可以找出这个K,然后暴力求和就可以了。

code

#include
#include
#include
#define ll long longusing namespace std;int T;ll a,b,x,y;ll ans;int main(){ cin>>T; while(T--) { scanf("%lld%lld%lld%lld",&a,&b,&x,&y); ll ans=0,k=1; if(b
y) break; if((k+1)*a<=k*b+1) { ans+=y-max(x,k*a)+1; break; } else ans+=min(y,k*b)-max(x,k*a)+1; k++; } cout<
<
上一篇:【牛客_2020.10.28】购物
下一篇:【SSL_2020.10.27】小A的游戏

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月31日 06时26分26秒