WA40分求助
  • 板块P1621 集合
  • 楼主Mei20091011
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/2/4 19:46
  • 上次更新2025/2/5 09:01:50
查看原帖
WA40分求助
1142019
Mei20091011楼主2025/2/4 19:46
#include <bits/stdc++.h>

using namespace std;

int a,b,p,f[100005];
vector<int>c[100005];
bool isprime[100005];
bool prime(int x)
{
    for(int i=2;i<=x/i;i++)
    {
        if(x%i==0)return 0;
    }
    return 1;
}
int findfa(int x)
{
    if(f[x]==x)return x;
    else return f[x]=findfa(f[x]);
}
unordered_set<int>se;
int main()
{
    cin>>a>>b>>p;
    for(int i=2;i<=b;i++)
    {
        if(prime(i))isprime[i]=1;
    }
    for(int i=a;i<=b;i++)
    {
        if(isprime[i])continue;
        for(int j=2;j<=i/j;j++)
        {
            if(!isprime[j])continue;
            if(i%j==0)
            {
                c[j].push_back(i);
                if(i/j!=j)c[i/j].push_back(i);
            }
        }
    }
    for(int i=p;i<=b;i++)f[i]=i;
    for(int i=p;i<=b;i++)
    {
        for(int j=0;j<c[i].size();j++)f[findfa(i)]=findfa(c[i][j]);
    }
    for(int i=a;i<=b;i++)se.insert(findfa(i));
    cout<<se.size();
    return 0;
}

WA40分 c数组表示的是每个数的倍数都有哪些,然后用并查集处理,最后用set统计联通块的个数,我这个思路哪里错了?

2025/2/4 19:46
加载中...