题目描述
解题思路
首先考虑用
[
A
,
B
]
[A,B]
[A,B]区间能凑成的区间为
[
A
,
B
]
,
[
2
A
,
2
B
]
,
[
3
A
,
3
C
]
.
.
.
.
[
k
A
,
k
B
]
[A,B],[2A,2B],[3A,3C]....[kA,kB]
[A,B],[2A,2B],[3A,3C]....[kA,kB]。
所以,我们要枚举这个k,累加
(
m
i
n
(
r
,
y
)
−
m
a
x
(
l
,
x
)
+
1
)
(min(r,y)-max(l,x)+1)
(min(r,y)−max(l,x)+1)。
PS:当 k A < = ( k − 1 ) B kA<=(k-1)B kA<=(k−1)B 时,区间就发生重合,之后的数就全部都能凑出来。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<map>
using namespace std;
long long a,b,t,x,y,l,r,i,ll,ans;
int main(){
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld%lld%lld",&a,&b,&x,&y);
ans=0;
i=1;
if(b<x)
i=x/b+1;
while(1)
{
l=i*a;
r=i*b;
if(l>y)
break;
ll=(i+1)*a;
if(ll<=r)
{
ans+=(y-max(l,x)+1);
break;
}
else
ans+=(min(r,y)-max(l,x)+1);
i++;
}
printf("%lld\n",ans);
}
}