Pagini recente » Cod sursa (job #2464254) | Cod sursa (job #2410678) | Cod sursa (job #639000) | Cod sursa (job #2563443) | Cod sursa (job #1866478)
#include <cstdio>
#include <cmath>
#define MAXN 3200
#define MAXP 500
double d[2][MAXN];
int u[MAXP][MAXN];
int ans[MAXN+1], prime[MAXP];
void calc(int n){
for(int i=2; i<n; i++){
int j=2;
while((j<i)&&(i%j!=0))
j++;
if(j==i) prime[++prime[0]]=i;
}
for(int i=1; i<=prime[0]; i++){
for(int j=1; j<=n; j++)
d[i%2][j]=d[(i-1)%2][j];
for(int s=prime[i]; s<=n; s*=prime[i]){
double aux=log(s);
for(int j=s; j<=n; j++){
if(d[(i-1)%2][j-s]+aux>d[i%2][j]){
d[i%2][j]=d[(i-1)%2][j-s]+aux;
u[i][j]=s;
}
}
}
}
int r=n;
for(int i=prime[0]; i>0; i--){
if(u[i][r]){
ans[++ans[0]]=u[i][r];
r-=u[i][r];
}
}
for(int i=0; i<r; i++)
ans[++ans[0]]=1;
}
int main(){
FILE *fin, *fout;
fin=fopen("nummst.in", "r");
fout=fopen("nummst.out", "w");
int n;
fscanf(fin, "%d", &n);
int p=2;
while(n%p!=0)
p++;
int add=n/p;
calc(p);
for(int i=1; i<=ans[0]; i++)
printf("%d\n", ans[i]);
for(int i=1; i<=ans[0]; i++)
fprintf(fout, "%d ", ans[i]*add);
fclose(fin);
fclose(fout);
return 0;
}