【数学】小Biu闯关

题目描述

在这里插入图片描述
在这里插入图片描述


解题思路

给出[A,B],首先可以确定[A~B]的数可以组成(B - A + 1个数)
通过样例解释可以发现,[2A~2B]的数可以组成(2B - 2A + 1个数)
那么可以得出[i * A~i * B]的数都可以组成

如果想不出,发挥一下昂贵草稿纸的作用,可以算出
如果i * B >= (i + 1) * A,也就是两个区间重合了的话,i * B之后的数都可以算出

可以直接枚举i

  • A很大,那么很快A就会乘到y
  • A很小,那么区间很快就会重合

Code
#include <iostream>
#include <cstdio>

using namespace std;

int T;
long long A, B, x, y, ans;

long long demo (long long A, long long B, long long x, long long y){
	long long s = 0;
	return max (s, min (B, y) - max (A, x) + 1);
}

int main(){
	scanf ("%d", &T);
	while (T--)
	{
		scanf ("%lld%lld%lld%lld", &A, &B, &x, &y);
		int i = 1;
		ans = 0;
		for (; i * B < (i + 1) * A - 1 && i * A <= y; i++)
	        ans += demo(i * A, i * B, x, y);
	    if (i * A <= y)//如果最后i没有乘到y,就暴力把剩余的数加上去
	       ans += y - max(x, i * A) + 1;
		printf ("%lld\n", ans);  
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值