D. Recover it!

Authors guessed an array aa consisting of nn integers; each integer is

not less than 22 and not greater than 2⋅1052⋅105. You don’t know the

array aa, but you know the array bb which is formed from it with the

following sequence of operations:

Firstly, let the array bb be equal to the array aa; Secondly, for each

ii from 11 to nn: if aiai is a prime number, then one integer paipai

is appended to array bb, where pp is an infinite sequence of prime

numbers (2,3,5,…2,3,5,…); otherwise (if aiai is not a prime number),

the greatest divisor of aiai which is not equal to aiai is appended to

bb; Then the obtained array of length 2n2n is shuffled and given to

you in the input. Here paipai means the aiai-th prime number. The

first prime p1=2p1=2, the second one is p2=3p2=3, and so on.

Your task is to recover any suitable array aa that forms the given

array bb. It is guaranteed that the answer exists (so the array bb is

obtained from some suitable array aa). If there are multiple answers,

you can print any.

Input

The first line of the input contains one integer nn

(1≤n≤2⋅1051≤n≤2⋅105) — the number of elements in aa.

The second line of the input contains 2n2n integers

b1,b2,…,b2nb1,b2,…,b2n (2≤bi≤27501312≤bi≤2750131), where bibi is the

ii-th element of bb. 27501312750131 is the 199999199999-th prime

number.

Output

In the only line of the output print nn integers a1,a2,…,ana1,a2,…,an

(2≤ai≤2⋅1052≤ai≤2⋅105) in any order — the array aa from which the

array bb can be obtained using the sequence of moves given in the

problem statement. If there are multiple answers, you can print any.

Examples

input

Copy

3
3 5 2 3 2 4
output Copy 3 4 2
input Copy 1
2750131 199999
output Copy 199999
input Copy 1
3 6
output Copy 6

题解如下

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int Len = 1e6;
int prime[Len * 3];
int ar[Len * 3];
int br[3 * Len];
int barrel[3 * Len];
vector<int> vec;
int n; bool cmp(int a,int b)
{
return a > b;
}
void Prime()
{
for(int i = 2; i <= Len * 3; i ++)
prime[i] = 1;
//素数筛选法
for(int i = 2; i * i <= Len * 3; i ++)
{
if(prime[i])
{
for(int j = i * i; j <= Len * 3; j += i)
prime[j] = 0;
}
}
} void init()
{
Prime(); int pos = 1;
for(int i = 2; i <= Len * 3; i ++)
{
if(prime[i])
{
ar[pos ++] = i;
}
}
//输入
for(int i = 1; i <= 2 * n; i ++)
{
scanf("%d",&br[i]);
}
//统计各个数字出现的次数
for(int i = 1; i <= 2 * n; i ++)
{
barrel[br[i]] ++;
}
sort(br + 1 , br + 2 * n + 1 , cmp);
}
void Solve()
{
init(); for(int i = 1; i <= 2 * n; i ++)
{
int cnt = barrel[br[i]];
if(cnt > 0)
{
if(! prime[br[i]])
{
int mx_divisor;
for(int j = 2; ; j ++)
if(br[i] % j == 0)
{
mx_divisor = br[i] / j;
break;
} if(barrel[mx_divisor] > 0)
{
barrel[mx_divisor] --;
vec.push_back(br[i]);
barrel[br[i]] --;
}
}
else
{
int pri = ar[br[i]];
if(barrel[pri] > 0)
{
barrel[pri] --;
vec.push_back(br[i]);
barrel[br[i]] --;
}
}
}
} for(auto x : vec)
printf("%d ",x);
} int main()
{
//freopen("test.txt","r",stdin);
scanf("%d",&n);
Solve(); return 0;
}

Codeforces Round #565 (Div. 3)--D. Recover it!--思维+欧拉筛的更多相关文章

  1. Codeforces Round #565 (Div. 3) C. Lose it! (思维)

    题意:给你一串只含\(4,8,15,16,23,42\)的序列,如果它满足长度是\(6\)的倍数并且有\(\frac {k}{6}\)个子序列是\([4,8,15,16,23,42]\),则定义它是好 ...

  2. Codeforces Round #288 (Div. 2)D. Tanya and Password 欧拉通路

    D. Tanya and Password Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/508 ...

  3. Product Oriented Recurrence(Codeforces Round #566 (Div. 2)E+矩阵快速幂+欧拉降幂)

    传送门 题目 \[ \begin{aligned} &f_n=c^{2*n-6}f_{n-1}f_{n-2}f_{n-3}&\\ \end{aligned} \] 思路 我们通过迭代发 ...

  4. Codeforces Round #565 (Div. 3) B. Merge it!

    链接: https://codeforces.com/contest/1176/problem/B 题意: You are given an array a consisting of n integ ...

  5. Codeforces Round #565 (Div. 3) A. Divide it!

    链接: https://codeforces.com/contest/1176/problem/A 题意: You are given an integer n. You can perform an ...

  6. Codeforces Round #565 (Div. 3) C. Lose it!

    链接: https://codeforces.com/contest/1176/problem/C 题意: You are given an array a consisting of n integ ...

  7. Codeforces Round #565 (Div. 3) B

    B. Merge it! 题目链接:http://codeforces.com/contest/1176/problem/B 题目 You are given an array a consistin ...

  8. Codeforces Round #565 (Div. 3) A

    A. Divide it! 题目链接:http://codeforces.com/contest/1176/problem/A 题目 You are given an integer n You ca ...

  9. Codeforces Round #565 (Div. 3) F.Destroy it!

    题目地址:http://codeforces.com/contest/1176/problem/F 思路:其实就是一个01背包问题,只是添加了回合和每回合的01限制,和每当已用牌数到了10的倍数,那张 ...

随机推荐

  1. VMware虚拟机从安装到激活再到创建虚拟机解决黑屏、卡、死机系列问题教程第二篇

    第二篇:在VMware中创建一个虚拟机(黑屏死机卡在最下面简单说一下你就懂了) 1.我们要打开我们已经安装好的VMware,然后点击创建新的虚拟机 2.然后选择自定义 3.下面这个默认,直接下一步 4 ...

  2. JavaScript(js)函数声明与函数表达式的区别

    在JavaScript中,函数是经常用到的,在实际开发的时候,我想很多人都没有太在意函数的声明与函数表达式的区别,但是呢,这种细节的东西对于学好js是非常重要的. 函数声明与函数表达式用代码写出来是这 ...

  3. swoft 上传图片到 阿里云oss aliyun-oss

    1.swoft  获取上传的文件 .官方文档上面没有看到 $files = $request->getUploadedFiles(); $file = $files['file']; 2.在模型 ...

  4. activiti设置customSessionFactories时的一个小坑

    现象:activiti设置customSessionFactories不起作用,流程还是走原来的查询方法原因:新实现的XXXEntityManagerFactory的getSessionType方法返 ...

  5. Python专题——五分钟带你了解map、reduce和filter

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题第6篇文章,给大家介绍的是Python当中三个非常神奇的方法:map.reduce和filter. 不知道大家看到ma ...

  6. Hadoop集群搭建(三)~centos6.8网络配置

    安装完centos之后,进入系统,进行网络配置.主要分为五个部分: 修改虚拟机网络编辑器:配置Winodws访问虚拟机:配置centos网卡:通过网络名访问虚拟机配置网络服务. (一)虚拟机网络编辑器 ...

  7. 使用 Pandas 的 to_excel() 方法来将多个 csv 文件合并到一个 xlsx 的不同 sheets 内

    这几天在用 Python3 研究一个爬虫,最后一个需求是把爬下来的20+个csv文件整合到一个excel表里的不同sheets. 初版的核心代码如下: while year <= 2018: c ...

  8. Requests发Post请求data里面嵌套字典

    一.Post请求,data里面嵌套字典 Requests发Post请求,data里面嵌套字典的常见形式如下: info = { "appid": "123", ...

  9. CentOs安装配置Jenkins(一)

    安装 RPM方式安装 #如果下列版本不是您需要的版本,可以到清华镜像站点查找自己需要的jenkins版本rpm地址 #清华镜像网址:https://mirrors.tuna.tsinghua.edu. ...

  10. .NET Core技术研究-HttpContext访问的正确姿势

    将ASP.NET升级到ASP.NET Core之后,相信大家都会遇到HttpContext.Current无法使用的问题.这也是我们迁移ASP.NET Core必须解决的问题. 本文我们详细讨论一下, ...