51nod 1131 覆蓋數字的數量

2022-05-19 19:43:11 字數 1069 閱讀 8538

給出a,b,表示有乙個區間為a到b

給出x,y,表示有乙個區間為x到y

求出x到y中能夠被a到b中的數(可重複)相加得到的不同的數的個數

亂搞題,暴力顯然不行,但是我們會發現

l到r中的數能被表示出來,那麼k*l到k*r的數也能被表示出來(k為常數)

其實這個性質很顯然

然後隨著k的增大,最終得到的區間會重疊

如樣例中a=8,b=10

(8 10)->(16 20)->(24 30)

->(32 40)->(40 50)....

會發現當k=4時,k*a=32,k*b=40,然後k再加1的時候,區間重疊了

一旦重疊,那就說明當k>=4時,32及以上的數都能被表示出來

所以我們就可以亂搞了,因為分界的k滿足k*b>=(k+1)a,所以我們可以得到k=a/(b-a),然後分情況就好了

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int

main()

if(a>x) x=a;

ll k=a/(b-a);

if(k==0||k==1)

ll sum=0

; ll l,r,ans1,ans2,mid;

l=1;r=k;ans1=-1

;

while(l<=r)

l=1;r=k;ans2=-1

;

while(l<=r)

ll s=0

;

if(ans2==-1

);

else

if(ans2else

else s=y-x+1

; }

printf(

"%lld\n

",s);

}return0;

}

51nod 1131 覆蓋數字的數量

原題鏈結 1131 覆蓋數字的數量 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 給出一段從a b的區間s a,b為整數 這段區間內的整數可以隨便使用任意次。再給出一段從x y的區間t,問用區間s中的整數做加法,可以覆蓋區間t中多少個不同的整數。例如 區間s為8...

51Nod 1131 覆蓋數字的數量

acm模版 十分有趣的乙個數列問題,只要找到 s 的規律即可,首先我們可以知道,s 所能覆蓋的區間一定是 ka,kb k 1,2,3,所以我們只需要逐個區間考慮與 t 的交集,但是這樣並不夠快,因為我們還有乙個規律沒有開發出來,仍然屬於暴力解題的範疇。而這個規律只需要多算幾個 k 就明了了,隨著 k...

覆蓋數字的數量 51Nod 1131

用 a,b 之間的這些數 可以表示的數的範圍是 a,b 2a,2b ka,kb 隨著k增大 這些區間很快就會出現相交的情況 這樣後邊的所有數就全都可以表示了 兩區間相交時有k b k 1 a 1 k a 1 b a 這裡的k即為需要計算的區間數量 因為這之前的區間都是不相交的 如果a很大 那區間左端...