题目描述
解题思路
给出[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);
}
}