Pagini recente » Cod sursa (job #2030801) | Cod sursa (job #1250939) | Cod sursa (job #775849) | Cod sursa (job #2548347) | Cod sursa (job #918353)
Cod sursa(job #918353)
#include <algorithm>
#include <fstream>
#include <cmath>
using namespace std;
ifstream F("nummst.in");
ofstream G("nummst.out");
const int Nmax = 3310;
const int Mmax = 510;
int Pr[Nmax];
bool TF[Nmax];
int N,Up,Sol[Nmax],Cnt;
double Log[Nmax],Din[Nmax][Mmax];
short Last[Nmax][Mmax];
int main()
{
F>>N;
if ( N%2 == 0 ) { G<<N/2<<' '<<N/2<<'\n';return 0; }
if ( N%3 == 0 ) { G<<N/3<<' '<<N/3*2<<'\n';return 0; }
int Lim = int(sqrt(double(N)));
for (int i=2;i<=Lim;++i)
if ( N%i == 0 )
{
Up = N/i, N = i;
break;
}
for (int i=2;i<=N;++i)
if( TF[i] == 0 )
{
for(int j=i*i;j<=N;j+=i)
TF[j]=1;
Pr[++Pr[0]]=i;
}
for(int i=1;i<=N;++i)
Log[i]=log(i);
for (int i=1;i<=N;++i)
for (int j=1;j<=Pr[0];++j)
{
Din[i][j]=Din[i][j-1];
Last[i][j]=0;
for (int k=Pr[j];k<=i;k*=Pr[j])
if ( Din[i][j] < Din[i-k][j-1] + Log[k] )
{
Din[i][j]=Din[i-k][j-1]+Log[k];
Last[i][j]=k;
}
}
int Act=N,NbrP=Pr[0];
while ( NbrP-- )
{
if ( Last[Act][NbrP] )
Sol[++Cnt]=Last[Act][NbrP]*Up;
Act-=Last[Act][NbrP];
}
if ( Act ) Sol[++Cnt]=Act*Up;
sort(Sol+1,Sol+Cnt+1);
for(int i=1;i<=Cnt;++i)
G<<Sol[i]<<' ';
G<<'\n';
F.close();
G.close();
return 0;
}