ABC215 D - Coprime 2(欧拉筛)

Posted live4m

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABC215 D - Coprime 2(欧拉筛)相关的知识,希望对你有一定的参考价值。

题意:

解法:

先质因子分解,将每个数>1的因子丢入set中,显然这些数是不能选的,
由于a[i]<=1e5,因此最后set的大小不会超过1e5,
对于set中的每一个元素x,显然x的倍数也是不能选的,因此将x的倍数筛掉.
那么剩下的未被筛的数就是答案了.
总复杂度O(n*log).

code:

#include<bits/stdc++.h>
#define int long long
#define PI pair<int,int>
using namespace std;
const int maxm=2e5+5;
int mark[maxm];
int a[maxm];
int n,m;
void solve(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    set<int>s;
    for(int i=1;i<=n;i++){
        for(int j=1;j*j<=a[i];j++){//记录所有因子
            if(a[i]%j==0){
                if(j>1)s.insert(j);
                if(a[i]/j>1)s.insert(a[i]/j);
            }
        }
    }
    for(auto i:s){
        for(int j=i;j<=m;j+=i){//所有因子的倍数也不能选
            mark[j]=1;
        }
    }
    vector<int>ans;
    for(int i=1;i<=m;i++){
        if(!mark[i])ans.push_back(i);
    }
    cout<<ans.size()<<endl;
    for(auto i:ans){
        cout<<i<<endl;
    }
}
signed main(){
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif // ONLINE_JUDGE
    ios::sync_with_stdio(0);cin.tie(0);
    solve();
    return 0;
}

以上是关于ABC215 D - Coprime 2(欧拉筛)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4804: 欧拉心算 欧拉筛

CodeForces - 1512G Short Task(欧拉筛求因子和)

欧拉筛(求质数)

线性(欧拉)筛&欧拉函数

欧拉筛法

Dirichlet's Theorem on Arithmetic Progressions POJ - 3006 线性欧拉筛