1. 程式人生 > >【帶除法的取模運算】hnoi2009有趣的數列

【帶除法的取模運算】hnoi2009有趣的數列

題目本身很簡單,有意識的人會打個表輕易地可以發現是個卡特蘭數列。

        眾所周知卡特蘭數列的最普通的遞推式是O(N^2)的,資料規模是1000000,很顯然過不了,卡特蘭數列第i項還有另外一個公式就是C(n,2n)/(n+1),這個除法怎麼辦?我們所知的取模運算是不滿足除法的,那應該怎麼辦?一個最直觀的想法就是分解質因數,然後對於每一個質數分別求出它的指數。通過對每個數進行質因數分解是不現實的,複雜度高達O(N^1.3),1000000的資料顯然過不了。

        ly給了我一個非常漂亮的演算法:假設現在我對於數字 i ,要把他的 j 次方加到答案中去,若k是 i 的一個質因子,那麼我只要把任務交給k和i/k就可以了,因為i^j=k^j+(i/k)^j,輪到算k或者i/k的時候只要把他的指數+上 j 即可,如果 i 是質數,直接加答案即可,因為最後的答案為整數,那麼必定i的指數是正數。

        至此我們的任務就只有對於資料規模中的數求出它的一個質因子即可,這讓我們想到了複雜度優秀的篩選法(O(N)),至此此題完美解決,而且演算法非常漂亮!!

 

傾情感謝ly童鞋!