1. 程式人生 > >又是畢業季1&&又是畢業季2

又是畢業季1&&又是畢業季2

最大的 strong 開始 如果 inf bsp 最大公約數 大於等於 出現的次數

又是畢業季2

n/k;

又是畢業季2

一開始很容易想到枚舉n個數取k個的所有組合,然後分別用輾轉相除法求最大公約數,但是復雜度明顯不符合要求,於是必須換一種思路。

我們想到,k個數的公約數含義就是這k個數均含有某個因數,如果我們把所有數的因數全部求出來,發現有k個數均含有某個因數,那麽這個數必然是這k個數的公約數。其中找出最大的就是它們的最大公約數。但是要如何高效的做到這點呢?考慮到對於k=1,2……,n都要求出,我們可以這麽做:

  • 1、 求出每個因數出現的次數。

  • 2、 對於每個次數記錄最大的因數。

  • 3、 根據f[k]=max(f[k],f[k+1])逆向遞推。(如果已經知道k個數的最大公約數是m,那麽l(l<k)個數的最大公約數一定大於等於m)。

算法復雜度o(n*sqrt(inf))。

又是畢業季1&&又是畢業季2