Pagini recente » Cod sursa (job #2647235) | Cod sursa (job #2169507) | Cod sursa (job #132567) | Cod sursa (job #401085) | Cod sursa (job #2098913)
#include <cstdio>
#include <cmath>
#define MAXP 3500
#define INF 2000000
char p[MAXP + 1];
int v[MAXP + 1], dv;
double d[2][MAXP + 1];
int pr[MAXP + 1][MAXP + 1];
char b[MAXP + 1][MAXP + 1];
inline void calcp(int n){
int i, j;
dv = 0;
v[++dv] = 1;
for(i = 2; i * i <= n; i++){
if(!p[i]){
v[++dv] = i;
for(j = i * i; j <= n; j += i)
p[j] = 1;
}
}
for(; i <= n; i++)
if(!p[i])
v[++dv] = i;
}
int main(){
FILE *in = fopen("nummst.in", "r");
int n, c;
fscanf(in, "%d", &n);
fclose(in);
c = 2;
while(n % c != 0)
c++;
c = n / c;
n = n / c;
calcp(n);
int i, j, lin, k;
int x;
for(i = 1; i <= n; i++)
d[0][i] = -INF;
for(i = 1; i <= dv; i++){
lin = (i & 1);
for(j = 0; j <= n; j++){
d[lin][j] = d[!lin][j];
pr[i][j] = pr[i - 1][j];
b[i][j] = 0;
x = v[i];
k = 1;
while(j >= x){
if(d[lin][j] < d[!lin][j - x] + k * log(v[i])){
d[lin][j] = d[!lin][j - x] + k * log(v[i]);
pr[i][j] = x;
b[i][j] = 1;
}
if(v[i] == 1)
x = INF;
x *= v[i];
k++;
}
}
}
FILE *out = fopen("nummst.out", "w");
if(v[pr[dv][n]] == n){
fprintf(out, "%d ", c);
n--;
}
while(dv >= 0 && n > 0){
if(b[dv][n]){
fprintf(out, "%d ", c * pr[dv][n]);
n -= pr[dv][n];
}
dv--;
}
fclose(out);
return 0;
}