Codeforces Round #565 (Div. 3) D. Recover it! (数学+素数)

题目链接
在这里插入图片描述
在这里插入图片描述
思路:我们先打好素数表,然后记录每个数的次数,从后往前遍历,如果这个数不在素数表里,那就说明它是合数,它要与前面的它的因子一起。

#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);
}
发布了171 篇原创文章 · 获赞 0 · 访问量 5789

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104660182