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 }
这里是用试除法求约数.倍增法应该比他快