Pagini recente » Cod sursa (job #2958177) | Cod sursa (job #3137877) | Cod sursa (job #318208) | Cod sursa (job #875954) | Cod sursa (job #2098905)
#include <cstdio>
#include <cmath>
#define MAXP 3500
#define INF 2000000000
char p[MAXP + 1];
int v[MAXP + 1], dv;
double d[2][MAXP + 1];
int pr[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[i] = 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;
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];
if(j >= v[i]){
if(d[lin][j] < d[lin][j - v[i]] + log(v[i])){
d[lin][j] = d[lin][j - v[i]] + log(v[i]);
pr[i][j] = i;
}
}
}
}
FILE *out = fopen("nummst.out", "w");
long long x;
char g;
if(v[pr[dv][n]] == n){
fprintf(out, "%d ", c);
n--;
}
while(dv >= 0 && n > 0){
x = 1;
g = 0;
while(pr[dv][n] == dv){
x *= v[dv];
n -= v[dv];
g = 1;
}
if(g)
fprintf(out, "%lld ", x * c);
dv--;
}
fclose(out);
return 0;
}