Pagini recente » Borderou de evaluare (job #2251965) | Borderou de evaluare (job #104062) | Borderou de evaluare (job #883903) | Borderou de evaluare (job #2212352) | Cod sursa (job #2501214)
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
const int NMAX = 1005;
const int VMAX = 50005;
bool c[VMAX];
void ciur(int n)
{
c[0] = c[1] = 1;
for(int i = 4 ; i <= n ; i += 2)
c[i] = 1;
int lim = (int)sqrt((double)n);
for(int i = 3 ; i <= lim ; i += 2)
{
if(c[i] == 0)
{
for(int j = i*i ; j <= n ; j += 2*i)
c[j] = 1;
}
}
}
struct ekon{
int val,nr;
bool operator<(const ekon &other) const{
return nr < other.nr;
}
};
priority_queue<ekon>pq;
int f[VMAX];
int primes[VMAX];
bool ok[NMAX];
int v[NMAX];
vector<int>sol;
void putinPeCal(int n)
{
int d = 2 , e = 0;
int lim = (int)sqrt((double)n);
while(d <= lim && n > 1)
{
e = 0;
while(n % d == 0)
{
e++;
n /= d;
}
if(e > 0)
primes[d]++;
d++;
}
}
bool check(int n)
{
for(int i = 1 ; i <= n ; i++)
if(!ok[i]) return false;
return true;
}
void print()
{
for(int i = 0 ; i < sol.size() ; i++)
printf("%d ",sol[i]);
printf("\n\n");
}
int main()
{
freopen("economie.in","r",stdin);
freopen("economie.out","w",stdout);
ciur(VMAX-5);
int n;
int cnt = 0;
scanf("%d",&n);
for(int i = 1 ; i <= n ; i++)
{
scanf("%d",&v[i]);
f[v[i]]++;
if(c[v[i]] == 0){
cnt++;
sol.push_back(v[i]);
ok[i] = true;
}
}
if(f[1] > 0)
{
printf("1\n1\n");
return 0;
}
for(int i = 0 ; i < cnt ; i++)
{
for(int j = 1 ; j <= n ; j++)
if(v[j] % sol[i] == 0){
ok[j] = true;
}
}
for(int i = 1 ; i <= n ; i++)
{
if(ok[i]) continue;
putinPeCal(v[i]);
}
for(int i = 1 ; i <= 50000 ; i++)
{
if(primes[i]==0)
continue;
ekon temp;
temp.val = i;
temp.nr = primes[i];
pq.push(temp);
}
while(!pq.empty() && !check(n))
{
while(pq.top().nr != f[pq.top().val])
{
ekon temp = pq.top();
temp.nr = f[pq.top().val];
pq.pop();
pq.push(temp);
}
sol.push_back(pq.top().val);
for(int i = 1 ; i <= n ; i++)
{
if(ok[i]) continue;
if(v[i] % pq.top().val == 0)
{
f[pq.top().val]--;
ok[i] = true;
}
}
pq.pop();
}
printf("%d\n",sol.size());
for(int i = 0 ; i < sol.size() ; i++)
printf("%d\n",sol[i]);
return 0;
}