1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 int a[1009],n,K,b[10000009],cnt; 7 bool cmp(int a1,int a2) 8 { 9 return a1>a2; 10 } 11 int main() 12 { 13 scanf("%d%d",&n,&K); 14 for(int i=1;i<=n;i++) 15 { 16 int a2; 17 scanf("%d",&a2); 18 int a1=sqrt(a2); 19 for(int j=1;j<=a1;j++) 20 if(a2%j==0) 21 { 22 b[++cnt]=j; 23 if(a2/j!=j) 24 b[++cnt]=a2/j; 25 } 26 } 27 sort(b+1,b+cnt+1,cmp); 28 int k=1; 29 for(int i=2;i<=cnt;i++) 30 if(b[i]==b[i-1]) 31 k++; 32 else 33 { 34 if(k>=K) 35 { 36 printf("%d\n",b[i-1]); 37 return 0; 38 } 39 k=1; 40 } 41 return 0; 42 }
由题 两个瓶子互相倒的话,倒出来一定是最大公约数,枚举所有数的约数,然后从大到小找到第一个出现次数大于K的就是答案。