1. 程式人生 > >覆蓋數字的數量 51Nod - 1131

覆蓋數字的數量 51Nod - 1131

https://www.51nod.com/Challenge/Problem.html#!#problemId=1131

用[a,b]之間的這些數 可以表示的數的範圍是[a,b] [2a,2b]...[ka,kb]... 隨著k增大 這些區間很快就會出現相交的情況 這樣後邊的所有數就全都可以表示了 兩區間相交時有k*b>=(k+1)*a-1 k>=(a-1)/(b-a) 這裡的k即為需要計算的區間數量 因為這之前的區間都是不相交的 如果a很大 那區間左端點k*a很快就會超過給定的y 如果a很小 那不相交的區間也很少 暴力即可

 

 

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll solve(ll l1,ll r1,ll l2,ll r2)
{
    return max(0ll,min(r1,r2)-max(l1,l2)+1);
}

int main()
{
    ll a,b,x,y,i,ans;
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld%lld%lld",&a,&b,&x,&y);
        ans=0;
        for(i=1;i*b<(i+1)*a-1&&i*a<=y;i++){
            ans+=solve(i*a,i*b,x,y);
        }
        if(i*a<=y) ans+=(y-max(x,i*a)+1);
        printf("%lld\n",ans);
    }
    return 0;
}