牛客跨年 最小互质数 线性筛法

地址

牛客跨年 最小互质数 线性筛法_第1张图片
时间复杂度O(n)

#include
#include
#include
#include
using namespace std;
const int maxn = 2e5 + 5;
int prime[maxn];
bool vis[maxn];
int a[maxn];
int fla[maxn];
int cnt = 0;
int main()
{
     
    int n;
    cin >> n;
    int f = 0;
    for(int i = 0 ; i < n; i++)
    {
     
        int x;
        cin >> x;
        a[x] = 1;
        if(x == 1)f = 1;
    }
    if(f == 0)
    {
     
        cout << 1 << endl;
        return 0;
    }
    else
    {
     
        for(int i = 2; i <= 200000; i++)
        {
     
            if(!vis[i]) //不是目前找到的素数的倍数
                prime[cnt++] = i; //找到素数
            int fg  = 1;int ans=  0 ;
            for(int j = 0; j < cnt && i * prime[j] <= 200000; j++)
            {
     
                vis[i * prime[j]] = true; //找到的素数的倍数不访问
                if(a[i * prime[j]])
                {
     
                  fla[prime[j]] = 1; //当前的素数有对应的数
                  fla[i] = 1;
                }
                if(i % prime[j] == 0) break; //关键!!!!
            }
        }
        for(int i = 0;i < cnt;i++)
        if(a[prime[i]] == 0 && fla[prime[i]] == 0)
        {
     
            cout << prime[i] << endl;
            break;
        }
    }
    return 0;
}

你可能感兴趣的:(筛法)