Pagini recente » Cod sursa (job #1488753) | Cod sursa (job #1407517) | Cod sursa (job #1142900) | Cod sursa (job #664412) | Cod sursa (job #2527543)
#include <bits/stdc++.h>
#define DIMN 10000
using namespace std;
int elem;
int c[DIMN] , sol[DIMN];
int prm[DIMN] , found[600][4010];
double rcs[600][4010];
pair <double , int> maxi[4010];
pair <int,int> tt[600][4010];
void ciur (int n){
int i , j;
for (i = 2 ; i <= n ; i++){
if (!c[i]){
prm[++elem] = i;
for (j = i ; j <= n ; j += i){
c[j] = 1;
}
}
}
}
int main()
{
FILE *fin = fopen ("nummst.in","r");
FILE *fout = fopen ("nummst.out","w");
int n , d , dmare , i , j , nr , sum;
fscanf (fin,"%d",&n);
d = 2;
while (d * d <= n){
if (n % d == 0){
dmare = n / d;
break;
}
d++;
}
/// suma trb sa fie dmic , adica acum n
n /= dmare;
ciur (n);
//found[0] = 1;
rcs[0][0] = -1;
for ( i = 1 ; i <= n ; i++ ){
rcs[0][i] = 0;
tt[0][i] = make_pair(i-1 , 0);
found[0][i] = 1;
}
for (i = 1 ; i <= elem ; i++){
for (nr = prm[i] ; nr <= n ; nr *= prm[i]){
for (j = 1 ; j + nr <= n ; j++){ /// iau de la un nr prim anterior
if (found[i-1][j] && maxi[j].first + log((double)nr) > rcs[i][j + nr]){
found[i][j + nr] = 1;
rcs[i][j + nr] = maxi[j].first + log((double)nr);
tt[i][j + nr] = make_pair(j , maxi[j].second);
}
}
}
for (j = 1 ; j <= n ; j++){ /// iau de la un nr prim anterior
if (maxi[j].first < rcs[i][j]){
maxi[j] = make_pair(rcs[i][j] , i);
}
}
}
sum = n;
int poz = maxi[n].second;
int xc = 0;
pair <int,int> aux;
while (sum){
sol[++xc] = sum - tt[poz][sum].first;
aux = tt[poz][sum];
sum = aux.first;
poz = aux.second;
}
for ( i = xc ; i ; i-- ){
fprintf (fout,"%d " , sol[i] * dmare);
}
return 0;
}