【校內模擬】【18-10-31】一串數字 【數論】

題解

1.0 認真分析

對於題目要求的兩兩權值之積不爲0,我們可以在n2的時間內處理出每兩個數之間的關係(即能否同時選)。但最後怎麼統計答案呢??emmm反正連邊跑最長路掛了

以上算法30pts

1.1 正解

那麼正解優越在哪裏呢??優越在它考慮了一個特殊的性質:

設 v= ipiai\prod{_{i} { {pi ^{ai} }}} ,則將 ai 替換爲 ai mod3並不會影響答案。
這樣轉化後,除了那些爲 1 的數,其他的每個 v 一一對應着 v′,這兩個數不能同時選取。

這個東西很容易證明,(因爲是嚴格的一次項對應二次項才能湊出三次項),就不多闡述了。

上面提到的是普遍情況,實際做的時候我們還要把本身就是立方數的數拿出來單獨考慮。因爲所有的立方數裏面你只能選一個,所以我們就貪心選最大的那個。

那麼對於剩下的,v和v’只能選一個,還是貪心選大的那個。因爲你會發現每一對之間的決策對別的決策沒有影響啊~

最後落實到代碼實現上,我們要怎麼存下v和v’呢?

我們設定v<v’,當我們算到v的時候就可以順便計算出v’(具體實現看代碼),自然算v’也會得到v。因此我們開兩個數組c[i]和d[i],v=i的貢獻存在c[v]裏,然後把這個v對應的v’的貢獻存在d[v]裏,最後統計答案只需要掃一遍,在c[i]和d[i]裏拿最大值就可以啦~

總結

主要是數學規律的問題,其次這個c數組和d數組的使用也比較巧妙,值得學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章