版权声明:转载记得标明出处哦~ https://blog.csdn.net/weixin_43890047/article/details/89042094
网址:http://codeforces.com/gym/101911/problem/D
备注:因自己写了出来,难度不大,涉及范围在标题指出,故不做分析。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 2e5+50;
struct NUM;
typedef map<int,NUM> MAP;
MAP M;
struct ANS
{
int a,b;
}ans[MAX_N];
struct NUM
{
int num;
int cnt;
int pos;
vector<int> factor;
};
int a[MAX_N];
void build(int n,vector<int>&vec,int &cnt)
{
int k = sqrt(n*1.00);
for(int i=1;i<=k;i++){
if(n%i==0){
vec.push_back(i);
vec.push_back(n/i);
vec.push_back(n/i);
vec.push_back(i);
cnt+=4;
}
}
if(vec[vec.size()-1]==vec[vec.size()-2]){
vec.erase(vec.end()-1);vec.erase(vec.end()-1);cnt-=2;
}
}
int main()
{
//ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
int num;
scanf("%d",&num);
a[i] = num;
if(!M.count(num)){
vector<int>buf;
int cnt = 0;
build(num,buf,cnt);
NUM xx;xx.cnt = cnt,xx.num=0,xx.factor=buf,xx.pos=0;
M[num] = xx;
}
M[num].num++;
}
bool flag1 = 1;
for(int i=0;i<n&&flag1;i++){
if(M[a[i]].num){
M[a[i]].num--;
if(M[a[i]].pos==M[a[i]].cnt){
flag1 = 0;
break;
}
ans[i].a = M[a[i]].factor[M[a[i]].pos];
ans[i].b = M[a[i]].factor[M[a[i]].pos+1];
M[a[i]].pos+=2;
}
}
if(flag1){
printf("YES\n");
for(int i=0;i<n;i++){
printf("%d %d\n",ans[i].a,ans[i].b);
}
}
else{
printf("NO\n");
}
return 0;
}