• 题意
    • 给出一个长度为2n的数组b,它是由a数组经过以下操作得到的
      1. 先将a数组复制进b数组
      2. 再从1~n判定ai
        • 如果ai是质数,那么添加第ai个质数进入b数组
        • 如果不是,那么添加ai除本身外的最大因数进入b数组
    • 保证有解(b数组中的顺序与a数组中无关)
  • 题解
    • 由题可知,第二步操作产生的质数一定大于原来的质数
    • 第二步产生的因数一定小于本身的数
    • 我们将每个质数做一个映射(标记它是第几大质数)
    • 所以我们只要从大到小扫一遍并做标记(题目说了一定有解,所以做标记只是为了防止扫到已经被大的数排除的数),这样就能保证不会将合数产生的质数和质数产生的质数混淆(因为扫到合数产生的质数之前必然先扫到该合数)
  • 代码
    • //#include<bits/stdc++.h>
      #include<algorithm>
      #include <iostream>
      #include   <fstream>
      #include  <cstdlib>
      #include  <cstring>
      #include  <cassert>
      #include   <cstdio>
      #include   <vector>
      #include   <string>
      #include    <cmath>
      #include    <queue>
      #include    <stack>
      #include      <set>
      #include      <map>
      using namespace std;
      #define P(a,b,c) make_pair(a,make_pair(b,c))
      #define rep(i,a,n) for (int i=a;i<=n;i++)
      #define per(i,a,n) for (int i=n;i>=a;i--)
      #define CLR(vis) memset(vis,0,sizeof(vis))
      #define MST(vis,pos) memset(vis,pos,sizeof(vis))
      #define pb push_back
      #define mp make_pair
      #define all(x) (x).begin(),(x).end()
      #define fi first
      #define se second
      #define SZ(x) ((int)(x).size())
      typedef pair<int,pair<int,int> >pii;
      typedef long long ll;
      typedef unsigned long long ull;
      const ll mod = 1000000007;
      const int INF = 0x3f3f3f3f;
      ll gcd(ll a, ll b) {
      	return b ? gcd(b, a%b) : a;
      }
      template<class T>inline void gmax(T &A, T B){
          (A<B)&&(A=B);//if(B>A)A=B;
      }
      template<class T>inline void gmin(T &A, T B){
          (A>B)&&(A=B);//if(B<A)A=B;
      }
      template <class T>
      inline bool scan_d(T &ret) {
      	char c;
      	int sgn;
      	if(c=getchar(),c==EOF) return 0; //EOF
      	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
      	sgn=(c=='-')?-1:1;
      	ret=(c=='-')?0:(c-'0');
      	while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
      	ret*=sgn;
      	return 1;
      }
      inline void outt(int x) {
      	if(x>9) outt(x/10);
      	putchar(x%10+'0');
      }
      const int MAXN = 1e6+10; 
      int vis[2750132];
      int prim[2750132];
      void prime(){
      	int cnt = 0;
      	for(int i=2;i<=2750131;i++){
      		if(!vis[i]){
      			prim[i]=++cnt;
      			for(int j =i*2;j<=2750131;j+=i){
      				if(!vis[j])vis[j]=1;
      			}
      		}
      	}
      }
      int b[MAXN];
      int a[MAXN];
      int num[2750132];
      bool cmp(int a,int b){
      	return a>b;
      }
      int main(){
      	prime();
      	int n;
      	cin>>n;
      	rep(i,1,n*2){
      		scanf("%d", &b[i]);
      		++num[b[i]];
      	}
      	sort(b+1,b+n*2+1,cmp);
      	rep(i,1,n*2){
      		if(num[b[i]]){
      			if(!vis[b[i]]){
      				num[b[i]]--;
      				num[prim[b[i]]]--;
      				//cout<<b[i]<<" "<<prim[b[i]]<<endl;
      				printf("%d ",prim[b[i]]);
      			}else{
      				printf("%d ", b[i]);
      				--num[b[i]];
      				int x;
      				rep(j,2,b[i]){
      					if(b[i]%j==0){
      						x = b[i]/j;
      						break;
      					}
      				}
      				--num[x];
      			}
      		}
      	}
      	return 0;
      }

发表评论

邮箱地址不会被公开。 必填项已用*标注