【数学】小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);  
	}
}
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页