Pagini recente » Cod sursa (job #363919) | Cod sursa (job #2821582) | Cod sursa (job #283411) | Cod sursa (job #2703156) | Cod sursa (job #2527589)
#include <bits/stdc++.h>
#define DIM 4000
using namespace std;
ifstream fin ("nummst.in");
ofstream fout ("nummst.out");
int ciur[DIM],p[DIM];
int sol[500][DIM];
double dp[500][DIM];
vector <int> ans;
int n,i,j,k,d,nr;
int main (){
fin>>n;
for (i=2;i*i<=n;i++)
if (n%i == 0)
break;
d = n/i;
n = i;
for (i=2;i<=n;i++){
if (!ciur[i]){
for (j=i+i;j<=n;j+=i)
ciur[j] = 1;
p[++k] = i;
}
}
/// dp[i][j] - cmmmc ul maxim daca il scriu pe i ca suma de puteri de nr prime
/// cu factori primi din primii j
dp[0][0] = log(1);
for (j=1;j<=k;j++){
/// nu iau nimic de la factorul asta
for (i=1;i<=n;i++)
dp[i][j] = dp[i][j-1];
int nr = p[j];
while (nr <= n){
for (i=n;i>=nr;i--){
if (dp[i-nr][j-1] + log(nr) > dp[i][j]){
dp[i][j] = dp[i-nr][j-1] + log(nr);
sol[i][j] = nr; /// tin minte din ce obtin starea i,j
}
}
nr *= p[j];
}
}
double maxi = 0;
int poz = 0;
for (i=1;i<=k;i++){
if (dp[n][i] > maxi){
maxi = dp[n][i];
poz = i;
}
}
int x = n;
while (x && poz){
if (sol[x][poz]){
ans.push_back(sol[x][poz]*d);
x -= sol[x][poz];
}
poz--;
}
while (x){ /// trb sa ma asigur ca suma da n
ans.push_back(d);
x--;
}
/*double maxi = 0;
int poz = 0, poz2 = 0;
for (i=1;i<=n;i++){
for (j=1;j<=k;j++)
if (dp[i][j] > maxi){
maxi = dp[i][j];
poz = i, poz2 = j;
}
}
int x = poz, y = poz;
while (x){
ans.push_back(sol[x][y]*d);
//fout<<sol[x]*d<<" ";
int aux_x = t[x][y].first;
int aux_y = t[x][y].second;
x = aux_x, y = aux_y;
}*/
if (ans.size() > 1){
sort (ans.begin(),ans.end());
for (auto it:ans)
fout<<it<<" ";
return 0;
}
for (i=1;i<=n;i++)
fout<<d<<" ";
return 0;
}