Pagini recente » Cod sursa (job #106671) | Cod sursa (job #1758917) | Cod sursa (job #2138086) | Cod sursa (job #1255469) | Cod sursa (job #1474860)
#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 i,j,k,Lim=int(sqrt(double(n)));
for(i=2;i<=Lim;++i)
if(n%i==0) {Up=n/i; n=i; break;}
for(i=2;i<=n;++i)
if(Tf[i]==0)
{ for(j=i*i;j<=n;j+=i) Tf[j]=1;
Pr[++Pr[0]]=i;
}
for(i=1;i<=n;++i) Log[i]=log(i);
for(i=1;i<=n;++i)
for(j=1;j<=Pr[0];++j)
{ Din[i][j]=Din[i][j-1]; Last[i][j]=0;
for(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'; g.close(); return 0;
}