題目連結:
題目大意:
輸入第一列給定一正整數 t ,代表有 t 筆測試資料,每筆佔一列。每列給定兩正整數 a 、 x (a ≦ x ≦ 2147483647)。
試問滿足下式
a + (a + 1) + (a + 2) + …… + (n - 1) + n ≧ x
的最小 n 值為何?
範例輸入:
5
2 3
1 10
1 11
5 5
5 18
範例輸出:
3
4
5
5
7
解題思維:
a + (a + 1) + (a + 2) + …… + (n - 1) + n ≧ x
可以用等差級數公式重寫為
(n + a)(n - a + 1) ÷ 2 ≧ x
展開移項後得
n ^ 2 + n + (-a ^ 2 + a - 2x) ≧ 0
而上式 = 0 之情況,根據一元二次方程式之公式解(注意 a 、 x 是給定值,不是未知數)再加上 n 應為正數之資訊可得出
n = (sqrt(1 + 4(a ^ 2 - a + 2x)) - 1) ÷ 2
其中 sqrt() 代表著求平方根之值。
因為此時的 n 值可以有著小數,而題目所求之 n 值為整數且要滿足 ≧ 0 之情況。因此所求為
ceil((sqrt(1 + 4(a ^ 2 - a + 2x)) - 1) ÷ 2)
其中 ceil() 為上高斯函數,對於正數為無條件進位至整數部分。
但是要注意的是 4(a ^ 2 - a + 2x) 會超過 32 位元有號整數能儲存之範圍,應使用 64 位元無號整數儲存(例如 C++ 的 unsigned long long)。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。