Pagini recente » Cod sursa (job #3150970) | Cod sursa (job #960077) | Cod sursa (job #235936) | Cod sursa (job #640924) | Cod sursa (job #956812)
Cod sursa(job #956812)
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
queue <int> q;
int P[500];
int p;
int N;
int gg,ss;
double dp[500][500];
vector <int> vec;
bool isPrime(int x)
{
for(int i=0; i < p && P[i] * P[i] <= x;i++)
{
if((x%P[i]) == 0) return 0;
}
return 1;
}
double solve(int k,int s)
{
if(k==p || !s) return 0;
double &ret = dp[k][s];
if(ret != -1) return ret;
int t=P[k];
ret=solve(k+1,s);
for(;t < s && t != ss;t*=P[k])
{
ret=max(ret,log10(t)+solve(k+1,s-t));
}
return ret;
}
void write(int k,int s)
{
if(!s) return;
if(k==p)
{
while(s--) vec.push_back(gg);
return;
}
int t=P[k];
int tt;
double res=solve(k,s);
if(res==solve(k+1,s)) write(k+1,s);
else
{
for(;t < s && t != ss;t*=P[k])
{
if(log10(t) + solve(k+1,s-t) == res)
{
tt=t;
while(tt > 1)
{
vec.push_back(gg*P[k]);
tt/=P[k];
}
write(k+1,s-t);
return;
}
}
}
}
void mem()
{
while(1) q.push(2);
}
int main()
{
freopen("nummst.in","r",stdin);
freopen("nummst.out","w",stdout);
scanf(" %d",&N);
for(int i=2;;i++)
{
if(!(N%i))
{
ss=i;
gg=N/i;
break;
}
}
for(int i=2;i<=ss;i++)
if(isPrime(i)) P[p++]=i;
for(int i=0;i<500;i++)
for(int j=0;j<500;j++)
dp[i][j]=-1;
solve(0,ss);
write(0,11);
if(!vec.size()) mem();
for(int i=0;i<(int)vec.size();i++)
printf("%d ",vec[i]);
printf("\n");
return 0;
}