Pagini recente » Cod sursa (job #1887319) | Cod sursa (job #2099617) | Cod sursa (job #274265) | Cod sursa (job #683567) | Cod sursa (job #2582181)
#include<fstream>
#include<math.h>
using namespace std;
ifstream fi("nummst.in");
ofstream fo("nummst.out");
int E[3200],Primes[3200];
double Dp[2][3200]; //trb matrice ca sa nu imi schimbe valoarea la Prv acelasi nr prim, chiar daca per total e mai pt suma valoarea respectiva, aici nu e
pair<int,int> Prv[505][3200];
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;
}
for(int i=1; i<=nr; i++)
Dp[0][i]=-1;
Dp[0][0]=0;
int cr=0;
for(int i=1; i<=nrp; i++)
{
cr=1-cr;
for(int j=1; j<=nr; j++)
{
Dp[cr][j]=Dp[1-cr][j];
Prv[i][j]=Prv[i-1][j];
}
for(int j=nr-Primes[i]; j>=0; j--)
{
double init=log10(1.0*Primes[i]);
double plg=init;
int p=Primes[i];
while(p+j<=nr)
{
if(p==nr)
break; //nu vreau sa am o singura gramada
if(Dp[cr][j+p]<Dp[1-cr][j]+plg)
{
Dp[cr][j+p]=Dp[1-cr][j]+plg;
Prv[i][j+p]={i-1,j};
}
plg=plg+init;
p=p*Primes[i];
}
}
}
int ind=0;
for(int i=1; i<=nr; i++)
{
if(Dp[cr][i]>Dp[cr][ind])
ind=i;
}
for(int i=1; i<=nr-ind; i++)
fo<<gcd<<" ";
int line=nrp;
while(ind!=0)
{
fo<<(ind-Prv[line][ind].second)*gcd<<" ";
int x=line;
int y=ind;
line=Prv[x][y].first;
ind=Prv[x][y].second;
}
fo<<"\n";
fi.close();
fo.close();
return 0;
}