luv_letters 在肝化學競賽題,他的夢想是混個省一,可是遺憾的是他今年的省二莫名消失了。html
話說societyniu比較欠扁,他嘲諷luv_letters的省二他都能拿,luv_letters固然不服2333.因而打算搞幾份卷子來考考他。c++
luv_letters有n種化競卷子,第i種卷子有ai道題。可是societyniu寫了太多題他又會不爽(實際上是怕輸了git
因而他規定他只能作K份卷子,而且爲了公平起見,K份卷子被寫的題數都必須是相同的,societyniu規定這個題數就是這K份卷子的題數的最大公約數。優化
爲何是最大公約數呢?由於他以爲題數是GCD的話他纔會變成GG 的clevel donkey。spa
以前說了,societyniu熱愛理科 所以他但願K種卷子的題數和最大。你能告訴他他最後總共會作多少題麼?code
第一行兩個正整數n,k。 第二行n個正整數,表示每份卷子的題數。htm
輸出格式:輸出一個正整數表示societyniu會作多少題。blog
3 1 1 2 3
3
對於30%的數據,保證k≤n≤20。ci
對於50%的數據,保證輸入中全部數小於5000。get
對於100%的數據,保證輸入中全部數小於500000,k≤n。
比賽連接:https://www.luogu.org/problemnew/show/T56342
好吧,這是我出的一道巨水的題
很顯然:
題目就至關於問n個數裏面選出k個的最大公約數最大是多少。
對於30%的數據能夠直接暴搜一發。(多爽
對於50%的數據...我也不知道(笑,大家能夠試試各類玄學剪枝優化qwq
對於100%的數據,先開500000大的桶存下每一個數出現了幾回,
而後枚舉最後的答案gcd,
而後再暴力枚舉全部它的倍數,看出現次數是否大於等於k就能夠了。
這樣作的複雜度最壞是O(n+n/2+n/3+…+n/n)=O(nlnn)的。
自行百度調和級數求和
std:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n, k, x, m, cnt[500010]; 4 inline int qread(){ 5 register int ch=getchar(),x=0; 6 while(!isdigit(ch)) ch=getchar(); 7 while (isdigit(ch)) x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar(); 8 return x; 9 } //隨手敲快讀 10 int main(){ 11 scanf("%d%d", &n, &k); 12 while(n--){ 13 x=qread(); 14 cnt[x]++; //開桶存數出現了幾回 15 m= m<x?x:m; 16 } 17 for(int i=m,tmp;i;i--){ 18 tmp = 0; 19 for(int j=i;j<=m;j+=i){ //暴力枚舉其全部倍數直接看是否大於K 20 tmp += cnt[j]; 21 } 22 if(tmp>=k){ 23 printf("%lld\n",(long long)i*k); 24 return 0; 25 } 26 } 27 }
真的挺水的
也能夠百度K-GCD