求助TLE
  • 板块P1621 集合
  • 楼主BugGod
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/4 21:39
  • 上次更新2023/11/5 00:16:14
查看原帖
求助TLE
541254
BugGod楼主2023/11/4 21:39

两个点TLE,用的线性筛板子,应该复杂度正确。。。

#include<bits/stdc++.h>
using namespace std;
int a,b,p,prime[100010],cnt,pri[100010],ans;

void mkpr(int r)
{
    for(int i=2;i<=r;i++)
    {
        if(prime[i]==0)pri[++cnt]=i;
        for(int j=1;j<=cnt&&i*pri[j]<r;j++)
        {
            prime[i*pri[j]]=1;
            if(i%pri[j]==0)break;
        }
    }
}

struct bcj
{
    int fa[100010];
    void init(int l,int r)
    {
        for(int i=l;i<=r;i++)fa[i]=i;
    }
    int find(int x)
    {
        if(fa[x]==x)return x;
        return find(fa[x]);
    }
    void unite(int x,int y)
    {
        int u=find(x),v=find(y);
        if(u!=v)fa[u]=v;
    }
}d;
int ceill(int x,int y)
{
    if(x/y*y==x)return x/y;
    return x/y+1;
}
int main()
{
    cin>>a>>b>>p;
    d.init(a,b);
    mkpr(b+1);
    int k=0;
    for(int i=1;i<=cnt;i++)if(pri[i]<p)k++;
    k++;
    for(int i=k;i<=cnt;i++)
    {
        int l=ceill(a,pri[i]);
        for(;pri[i]*(l+1)<=b;l++)d.unite(pri[i]*l,pri[i]*(l+1));
    }
    for(int i=a;i<=b;i++)ans+=(int)(d.fa[i]==i);
    cout<<ans;
    return 0;
}
2023/11/4 21:39
加载中...