题目链接
思路:我们先打好素数表,然后记录每个数的次数,从后往前遍历,如果这个数不在素数表里,那就说明它是合数,它要与前面的它的因子一起。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2750132;
int top=0,isprime[maxn<<1]={0},prime[maxn]={0},pos[maxn<<1],num[maxn<<1];
vector<int>ans;
int findmax(int x)
{
for(int i=2;i*i<=x;++i)
if(x%i==0) return x/i;
}
void Prime(int n)
{
for(int i=2;i<=n;++i)
{
if(!isprime[i]) prime[++top]=i,pos[i]=top;
for(int j=1;j<=top;++j)
{
if(i*prime[j]>n) break;
isprime[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int main()
{
int n,t;
Prime(maxn);
scanf("%d",&n);
for(int i=1;i<=2*n;++i) scanf("%d",&t),num[t]++;
for(int i=maxn-1;i>=1;--i)
{
if(num[i]<=0) continue;
while(num[i]>0)
{
if(!isprime[i]) ans.push_back(pos[i]),num[pos[i]]--;
else ans.push_back(i),num[findmax(i)]--;
num[i]--;
}
}
for(auto i:ans) printf("%d ",i);
}