覆蓋數字的數量 51Nod - 1131
阿新 • • 發佈:2018-12-12
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; }