洛谷题单指南-进阶数论-CF757B Bash's Big Day

原题链接: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个都选不出来,说明所有数都是1
    cout << ans;
    return 0;
}

 

posted @ 2025-10-15 14:17  hackerchef  阅读(5)  评论(0)    收藏  举报