51NOD 1131 覆蓋數字的數量 規律 公式

2021-09-25 17:19:57 字數 1100 閱讀 5446

1.0 秒

131,072.0 kb

20 分

3級題給出一段從a - b的區間s(a,b為整數),這段區間內的整數可以隨便使用任意次。再給出一段從x - y的區間t,問用區間s中的整數做加法,可以覆蓋區間t中多少個不同的整數。

例如:區間s為8 - 10,區間t為3 - 20。在3 - 20中,整數8(8),9(9),10(10),16(8+8),17(8+9),18(9+9),19(9+10),20(10+10)。可以被區間s中的數覆蓋,因此輸出8。

收起

第1行:乙個數t,表示後面用作輸入測試的數的數量。(1 <= t <= 1000)

第2 - t + 1行:每行4個數:a, b , x, y,中間用空格分隔。(1 <= a < b <= 10^18, 1 <= x < y <= 10^18)

輸出共t行,每行1個數,區間[x,y]中可以由a-b中的整數相加得到的不同整數的數量。
1

8 10 3 20

8
我們知道對於[a,b],可以構造[a,b],[2*a,2*b],[3*a,3*b]........還有乙個規律就是如果某處相交,則往後的數都能覆蓋,比如[ka,kb][(k+1)a,(k+1)b]  如果kb>=(k+1)a,kb以後的數都能構造。

k=   a/(b-a)

#include using namespace std;

typedef long long ll;

typedef long long ll ;

const int n=1e5+7;

int n;

ll a[n];

ll sum=0;

ll solve(ll a,ll b,ll x,ll y)

if((a>=x&&b<=y)||(a<=x&&b>=y))

if(a>=x&&a<=y&&b>=y) }

int main()

ll ans=0;

for(int i=1;iprintf("%lld\n",ans+solve(k*a,y,x,y));

} return 0 ;

}

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很大 那區間左端...