因为要遵守字典序大于等于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; } }
原文:https://www.cnblogs.com/orange-/p/10809427.html