原题链接:https://www.luogu.com.cn/problem/CF757B
题意解读:从n个数中选最多的gcd不为1的数的数量。
解题思路:
gcd不为1,那么可以从素因子作为切入点,用埃氏筛素数的过程,去用每一个素数的倍数去原数组里去查找对应的数的个数之和
还要算上素数自身在原数组中的个数,就是该素数的所有倍数的个数,对每个素数的倍数个数取最大值即可
需要注意,如果每个数都是1,计算得到的个数将是0,需特判,只能选1个数。
100分代码:
#include <bits/stdc++.h>
using namespace std;const int N = 100005;
bool vis[N];
int s[N], maxs, h[N];
int n, ans;int main()
{cin >> n;for(int i = 1; i <= n; i++) cin >> s[i], h[s[i]]++, maxs = max(maxs, s[i]);for(int i = 2; i <= maxs; i++){if(!vis[i]){int cnt = h[i];for(int j = i + i; j <= maxs; j += i) {vis[j] = true;if(h[j]) cnt += h[j];}ans = max(ans, cnt);}}if(ans == 0) ans = 1; //1个都选不出来,说明所有数都是1cout << ans;return 0;
}