ABC215 D - Coprime 2(欧拉筛)

该博客介绍了一种利用质因子分解解决数论问题的方法。通过输入一系列数字,程序首先找出所有大于1的因子并存入集合,然后筛掉这些因子及其倍数,得到未被筛掉的数作为答案。复杂度为O(n*log)。代码示例展示了如何实现这一过程。
摘要由CSDN通过智能技术生成
题意:

在这里插入图片描述

解法:
先质因子分解,将每个数>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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值