alice 有 \(n\) 個正整數,數字從 \(1 \sim n\) 編號,分別為 \(a_1,a_2, \cdots , a_n\)。
bob 剛學習取模運算,於是便拿這 \(n\) 個數進行練習,他寫下了所有
\(a_i\) mod \(a_j (1 \le i,j \le n \wedge i \neq j)\)
的值,其中 mod 表示取模運算。
alice 想知道所有的結果中,嚴格次大值是多少。將取模後得到的所有值進行去重,即相同的結果數值只保留乙個,剩餘數中第二大的值就稱為嚴格次大值。
首先我們要排除無關因素帶來的影響。
這裡很明顯的乙個無關因素就是重複的元素。
我們假設存在 \(a_i = a_j\) 且 \(i \neq j\),則對於任何乙個 \(k \neq i \wedge k \neq j\):
所以數值相同的兩個元素是等價的。
我們可以給 \(a1\) 到 \(a_n\) 從小到大排序並去重。
我們假設去重後還剩下 \(m\) 個元素,且這些元素滿足 \(a_1 \lt a_2 \cdots \lt a_m\)。
則我們可以分 \(m=1\)、\(m=2\)、\(m \gt 2\) 三種情況分開討論:
當 \(m=1\) 時,陣列中只有乙個元素:
當 \(m=2\) 時,只有兩個候選答案 \(a_1\) mod \(a_2\) 和 \(a_2\) mod \(a_1\),又因為 \(a_1\) mod \(a_2 = a_1\),\(a_2\) mod \(a_1 \lt a_1\)(餘數必然小於除數),所以次大值肯定是 \(a_2\) mod \(a_1\)。
當 \(m \gt 2\) 時,可以確定的是最大值是 \(a_\) mod \(a_m\)。
次大值應該是以下兩者的較大值:
為了方便講述起見,我接下來用 \(a \% b\) 來表示 \(a\) mod \(b\),並且我們這裡只證明 \(m \gt 2\) 的情況。
這裡有乙個非常重要的基礎性質:
性質1:餘數永遠小於除數!
我們接下來會反覆運用到這個性質1進行分析。
因為 \(a_ \% a_m = a_\)。
證:我們把 \(a_i \% a_j\) 的組合分為 \(2\) 部分:
第一部分:\(j=m\)
此時 \(i \in [1, m-1]\),
\(a_1 \% a_m \lt a_2 \%a_m \lt \cdots \lt a_ \% a_m\)
所以第一部分的最大值是 \(a_ \% a_m = a_\)
第二部分:\(j \neq m\),
此時,除數最大是 \(a_\),根據性質1,可得:這一部分的所有答案都小於 \(a_\)。
據此可得:最大值即為 \(a_ \% a_m = a_\)。
次大值其實就是除了 \(a_\) 以外的最大值。
第一部分裡面除了 \(a_ \% a_m\) 以外的最大值就是 \(a_ % a_m = a_\) 了。
第二部分我們可以將它拆分成兩小部分:
第2.1部分:\(j = m-1\) 的部分,這一部分的是 \(a_\) 和 \(a_m \% a_\) 的較大值;
第2.2部分:\(j \le m-2\) 的部分,根據性質1,這一部分的所有答案都 \(\lt a_\)。
綜上所述,我們可以發現,次大值的競爭者只有 \(2\) 個值:\(a_\) 或者 \(a_m \% a_\)。
所以此時次大值即為 \(\max(a_, a_m \% a_)\)。
另附上一張方便理解:
實現**如下:
#include using namespace std;
const int maxn = 200020;
int n, m, a[maxn], ans;
int main()
洛谷 P2829 大逃離 題解
題目鏈結 一道模板的次短路 設 d is x dist x dis x dist x dis x dis t x 分別為點 1 11 到 x xx 的最短路和次短路長度 我們只需在跑最短路時,順帶更新一下次短路 由於每個點可以經過多次,我們只能使用 spfa 對於每條邊 x,y x,y x,y 考慮...
洛谷 P4933 大師 題解(dp)
設定 dp i j 表示以 i 結尾公差為 j 的等差數列個數 你可能會想為什麼是 i 結尾而不是開始呢,其實你會發現如果設以 i 開始根本不知道怎麼設狀態轉移方程 注意轉移方程要設定偏移量p,要不然陣列可能就會負數。所以陣列開大兩倍。還有要注意ans加的不是dp i a i a j p 因為可能後...
洛谷P1373小a和uim大逃離題解
這個題好坑啊,首先是他會卡空間,然後我們就只能把一種比較好理解的狀態給捨棄,因為空間開不下,然而採用一種難理解的狀態就是 dp i j l 0 1 表示 i j 位置,兩者的差為 l 當前由誰來吸收的方案數。然後我們就可以推出狀態轉移方程,此狀態轉移方程很好寫,主要就是狀態非常難想,因此我們如果狀態...