切換
舊版
前往
大廳
主題

ZeroJudge - a810: 1. 倍數關係 解題心得

Not In My Back Yard | 2020-07-17 00:06:13 | 巴幣 0 | 人氣 342

題目連結:


題目大意:
給定四個整數 a 、 b 、 x 、 y (a < b ,|a| 、 |b| 、 |x| 、 |y| ≦ 10 ^ 18),求 a(含) ~  b(含)之間有多少整數可被 x 或是 y 整除?



範例輸入:
範例輸入一:
1 10 1 1

範例輸入二:
1 100 2 3

範例輸入三:
-100 100 2 8


範例輸出:
範例輸出一:
10

範例輸出二:
67

範例輸出三:
101


解題思維:
先將 x 、 y 取絕對值,不影響答案且比較方便計算。

因為 0 乘以任何數皆為 0 ,所以 0 也是所有數的倍數。將給定的區間[a, b]分為兩種:
一:a < 0 且 b > 0
二:其他, a 、 b ≧ 0 以及 a 、 b ≦ 0

假設要計算 1 ~ n 可被 x 、 y 整除的個數,其公式為 floor(n ÷ x) + floor(n ÷ y) - floor(n ÷ lcm(x, y)) ,其中 floor 代表向下取整(在此因除數和被除數皆為正數,因此等價於無條件捨去)、 lcm 代表兩數的最小公倍數。

一的情況比較簡單,分別計算 1 ~ |a| 以及 1 ~ b 各自有多少能被 x 或 y 整除(按照上面的公式),然後加上「0」的情況即可。

二的情況,則是先求 1 ~ |b| 可被整除的個數,然後減去 1 ~ |a - 1| 可被整除的個數。如此一來才是 |a| ~ |b| 區間的答案。

但是因為 x 、 y 各自有可能為 0 ,因此上面的公式就不需要除以是 0 的數字且也可以忽略 lcm 那塊;同時 x 、 y 也有可能很大,然後還互質。如此一來兩者的 lcm 就會遠大於 10 ^ 18,所以需要額外處理(這題可以不用寫大數,可以在此情況發生時將 lcm 設為一個大於 10 ^ 18 的值)

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作