P1414 又是毕业季II

原题链接

考察:约数

看题解说是常规数论题,本蒟蒻果然fw

错误思路:

       暴力枚举,但是这一定TLE

正确思路:

       这道题实质上就是求每个数的约数.时间复杂度O(N*√inf)大概10^8左右.这个思路比较容易想到.但是输出1、2....i个数的公约数就比较难(对本蒟蒻而言).实际上.我们统计完每个数的约数后.从大往小枚举,如果约数出现次数>=要求的人数,那么此约数就是答案.(因为每个数只能贡献一次相同约数)

易错:

      输出一行答案后不能i--,因为此约数可能也是其他人数的答案

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N = 100010;
 6 int a[N],cnt[N*10];
 7 void Getcnt(int n)
 8 {
 9     for(int i=1;i<=n/i;i++)
10     {
11         if(n%i==0) cnt[i]++,cnt[n/i]++;
12         if(n%i==0&&i==n/i) cnt[n/i]--;
13     }
14 }
15 int main()
16 {
17     freopen("in.txt","r",stdin);
18     int n,maxn = 1<<31;
19     scanf("%d",&n);
20     for(int i=1;i<=n;i++)
21     {
22         scanf("%d",&a[i]);
23         Getcnt(a[i]);
24         maxn = max(maxn,a[i]);
25     }
26     for(int i=maxn,j=1;i>0;i--)
27     {
28         if(cnt[i]>=j)
29         {
30             printf("%d\n",i);
31             j++;
32             if(j>n) break;
33             i++; 
34         }
35     }
36     return 0;
37 }

 

这里是用试除法求约数.倍增法应该比他快

posted @ 2021-01-19 17:20  acmloser  阅读(56)  评论(0编辑  收藏  举报