Cod sursa(job #1866478)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 3 februarie 2017 10:09:30
Problema NumMst Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#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;
}