Pagini recente » Cod sursa (job #2953998) | Cod sursa (job #1334384) | Cod sursa (job #2166971) | Cod sursa (job #1540394) | Cod sursa (job #2527512)
#include <bits/stdc++.h>
#define DIMN 10000
using namespace std;
int elem;
int c[DIMN] , sol[DIMN];
int tt[DIMN] , prm[DIMN] , found[DIMN];
double rcs[DIMN];
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 , dmic , dmare , i , j , nr , sum;
fscanf (fin,"%d",&n);
d = 2;
while (d * d <= n){
if (n % d == 0){
dmic = d;
dmare = n / d;
break;
}
d++;
}
/// suma trb sa fie dmic , adica acum n
n /= dmare;
ciur (n);
//found[0] = 1;
rcs[0] = -1;
for ( i = 1 ; i <= n ; i++ ){
rcs[i] = 0;
tt[i] = i-1;
found[i] = 1;
}
for (i = 1 ; i <= elem ; i++){
nr = prm[i];
if (nr != n && (!found[nr] || rcs[nr] < log((double)nr))){
found[nr] = 1;
rcs[nr] = log((double)nr);
tt[nr] = 0;
}
for (j = 1 ; j + nr <= n ; j++){
if (found[j] && rcs[j] + log((double)nr) > rcs[j + nr]){
found[j + nr] = 1;
rcs[j + nr] = rcs[j] + log((double)nr);
if (j - tt[j] == nr) /// ai adaugat tot nr
tt[j + nr] = tt[j];
else tt[j + nr] = j;
}
}
}
sum = n;
int xc = 0;
while (sum){
sol[++xc] = sum - tt[sum];
sum = tt[sum];
}
for ( i = xc ; i ; i-- ){
fprintf (fout,"%d " , sol[i] * dmare);
}
return 0;
}