| 959 D

因为要遵守字典序大于等于a数组,且在此前提下b数组字典序最小。所以复制a数组直到某个数不满足两两互质的要求,则从这个数开始枚举,直到有数满足要求。

Tips:所有加入b数组的数都要分解因数,在后续枚举中筛掉不与它们互质的数。

#include <bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
 
int n,x;
const int Maxn = 2e6 + 100;
int prime[Maxn],vis[Maxn];
 
void makee(int x) {
    for(int i = x; i <= Maxn; i += x)
        vis[i] = 1;
    return ;
}
void fenjie(int x) {
    int i = 2;
    while(i <= x) {
        if(x % i == 0) {
            if(!prime[i])
                makee(i);
            prime[i] = 1;
            x /= i;
            i = 2;
        } else
            i++;
    }
}
 
int main() {
    
    ios::sync_with_stdio(false);
    while(cin >> n) {
        int flag =  0;
        int  y;
        memset(vis,0,sizeof(vis));
        memset(prime,0,sizeof(prime));
        int id = 2,cnt = 0;
        for(int i = 0; i < n; i++) {
            cin >> x;
            if(flag) {
                cnt = i;
                for(int j = id; j <= Maxn; j++) {
                    if(!vis[j]) {
                        cout << j << " ";
                        if(!prime[j])
                            makee(j);
                        id = j + 1;
                        break;
                    }
                }
                continue;
            }
            if(vis[x]) {
                for(int j = 2; j <= Maxn; j++)
                    if(!vis[j]) {
                        y = j;
                        cout << y << " " ;
                        flag = 1;
                        break;
                    }
                fenjie(y);
                vis[y] = 1;
            } else {
                cout << x << " ";
                fenjie(x);
                vis[x] = 1;
            }
        }
        cout <<endl;
    }
 
}
View Code

猜你喜欢

转载自www.cnblogs.com/orange-/p/10809427.html
今日推荐