Pagini recente » Cod sursa (job #443207) | Cod sursa (job #2566847) | Cod sursa (job #1268109) | Cod sursa (job #2854877) | Cod sursa (job #2582130)
#include<fstream>
using namespace std;
ifstream fi("nummst.in");
ofstream fo("nummst.out");
int E[2500],Primes[2500],Dp[2500],Prv[2500];
int main()
{
int n;
fi>>n;
int nr,gcd;
for(int i=2; i*i<=n; i++)
{
if(n%i==0)
{
nr=i;
gcd=n/i;
break;
}
}
int nrp=0;
for(int i=2; i<=nr; i++)
{
if(E[i])
continue;
Primes[++nrp]=i;
for(int j=i+i; j<=nr; j+=i)
E[j]=1;
}
Dp[0]=1;
for(int i=1; i<=nrp; i++)
{
for(int j=nr-Primes[i]; j>=0; j--)
{
int p=Primes[i];
while(p+j<=nr)
{
if(p==nr)
break; //nu vreau sa am o singura gramada
if(Dp[j+p]<Dp[j]*p)
{
Dp[j+p]=Dp[j]*p;
Prv[j+p]=j;
}
p=p*Primes[i];
}
}
}
int ind=0;
for(int i=1; i<=nr; i++)
{
if(Dp[i]>Dp[ind])
ind=i;
}
for(int i=1; i<=nr-ind; i++)
fo<<gcd<<" ";
while(ind!=0)
{
fo<<(ind-Prv[ind])*gcd<<" ";
ind=Prv[ind];
}
fo<<"\n";
fi.close();
fo.close();
return 0;
}