題目傳送門:
題意:
有n個數,求每k(k從1列舉至n)個數的最大公約數。
思路:
我們可以知道,每乙個數可以進行分解,統計每乙個數做因子時所出現個個數total。
語文不好,舉個例子吧。
因子 數12
34total11
1114
2010
1230
0101
4000
11我們可以發現,total為結果。
證明:
我們可以發現隨著k的增長,最大公因數不會增長(即相等或減小),那麼,我們每一次從最後乙個數i(最後乙個total)i(i為位置
)開始,向回推。因為如果在陣列中為i的有x個因子,且x>=k(k為列舉1~n),那麼i為結果。說明這k個數至少每乙個都能得到乙個為i的因數,因為是反向列舉,所以這時i是最大的,即最優解。注意:這是乙個while的過程!
**:
#include#includeusing namespace std;
int n,ma=0;
int a[1500000];
int main()
} int p=1;
for(int i=ma;i>=1;i--)
while(a[i]>=p)
}
P1414 又是畢業季
luogu 傳送門 我們列舉1 maxn每個數 i 求出它的倍數的個數cnt,那麼cnt就是以 i 為最大公約數時數的個數,那麼 i 就可能作為從1 cnt 的答案,對ans取max就可以了。include include include include include include includ...
P1414 又是畢業季II
又是畢業季ii 給定 n 和序列 a 1 dots a n 求 k 個數的公約數的最大值,其中 1 leq k leq n 簽到好題。對於每個數進行因數分解,記錄下每個因數出現的數量。設 f x 表示因數 x 出現的次數,那麼對於 k 我們便需要找到 f x geq k 並且 x 盡量大。那麼直接從...
P1414 又是畢業季II
數論題,主要在於推演。洛谷的 又是畢業季i 更好玩 發現對於所有的同學的能力值,只要我們選出每個數的所有因子並記錄所有同學所有因子出現的次數,就可以得到乙個c陣列為所有因子出現的次數。因為讓輸出1 n所有的值,而且因子數c k 1 c k 我們就一定可以從因子數最高的c向下遍歷到c i 更高的位置,...