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的就是答案。

posted on 2016-03-20 22:41  xiyuedong  阅读(120)  评论(0编辑  收藏  举报