分析:
首先考虑用
[
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
A
<
=
(
k
−
1
)
B
kA<=(k-1)B
kA<=(k−1)B时 区间就发生重合 之后的数就全部都能凑出来
所以我们只需要快速找到这个
k
k
k即可 我们发现
k
A
−
(
k
−
1
)
B
kA-(k-1)B
kA−(k−1)B满足单调性 所以我们可以二分这个
k
k
k
CODE:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll solve(ll n,ll x,ll y)
{
ll a=(x-1)/(y-x)+1,b =n/x;
if(a<=b) return a*(a-1)/2*(y-x)+a-1+n-a*x+1;
return b*(b-1)/2*(y-x)+b-1+min(n,b*y)-b*x+1;
}
int main(){
int t;
scanf("%d",&t);
while(t--)
{
ll x,y,L,R;
scanf("%lld%lld%lld%lld",&x,&y,&L,&R);
printf("%lld\n",solve(R,x,y)-solve(L-1,x,y));
}
return 0;
}