Pagini recente » Cod sursa (job #102542) | Cod sursa (job #2124995) | Cod sursa (job #3253363) | Cod sursa (job #2933244) | Cod sursa (job #2527469)
#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;
}
/// 21 28 -> 3 4 -> sum 7
for (i = 1 ; i <= elem ; i++){
nr = prm[i];
if (!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 (j == 3 && nr == 2)
// printf ("%lf\n" ,log((double)nr) );
if (found[j] && rcs[j] + log((double)nr) > rcs[j + nr]){
//printf ("intra\n");
found[j + nr] = 1;
rcs[j + nr] = rcs[j] + log((double)nr);
tt[j + nr] = j;
}
}
}
sum = n;
int xc = 1;
int ant = -1;
while (sum){
if (sum - tt[sum] != ant)
sol[++xc] = sum - tt[sum];
else sol[xc] += (sum - tt[sum]);
ant = sum - tt[sum];
sum = tt[sum];
}
for ( i = xc ; i ; i-- ){
if (sol[i])
fprintf (fout,"%d " , sol[i] * dmare);
}
return 0;
}