Cod sursa(job #47094)

Utilizator damaDamaschin Mihai dama Data 3 aprilie 2007 12:38:16
Problema Descompuneri Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <map>

using namespace std;

int n, desc, a[1000][1000], diviz[1000], d[1000], p[1000], cnt = 0, nrdiv, x = 1, s[1000];
map <int, int> cheie;


void bkt(int k);

int main()
{
    freopen("desc.in","r",stdin);
    freopen("desc.out","w",stdout);

    int i, temp, tn, j, crt, last, loop = 0, product = 1;

    scanf("%d%d", &n, &desc);

    temp = sqrt(n);
    tn = n;

    for(i = 2; i <= temp; ++i)
    {
        if(tn % i == 0)
            d[++cnt] = i;
        while(tn % i == 0)
        {
            ++p[cnt];
            tn /= i;
        }
    }
    if(tn > 1)
    {
        d[++cnt] = tn;
        p[cnt] = 1;
    }


    bkt(1);
    sort(diviz + 1, diviz + nrdiv);

    for(i = 0; i < nrdiv; ++i)
        cheie[diviz[i]] = i;


    for(i = 1; i < nrdiv; ++i)
    {
        a[0][i] = 1;
    }
    for(i = 1; i < nrdiv; ++i)
    {
        for(j = i; j > 0; --j)
        {
            a[i][j] = a[i][j + 1];
            if(diviz[i] % diviz[j] == 0)
            {
                a[i][j] += a[cheie[diviz[i] / diviz[j]]][j];
            }
        }
    }

    printf("%d\n", a[cheie[n]][1]);
    temp = a[cheie[n]][1];
    crt = nrdiv - 1;
    last = 1;

    while(product < n)
    {
        for(i = last; i < nrdiv; ++i)
        {
            if(temp - a[crt][i + 1] >= desc)
                break;
        }

       // printf("%d %d ", i, temp - a[cheie[crt]][i + 1]);
        printf("%d ", diviz[i]);
        product *= diviz[i];
        desc -= temp - a[crt][i];
        crt = cheie[diviz[crt] / diviz[i]];
        temp = a[crt][i];
        last = i;
        //printf("%d %d %d", desc, crt, temp);
    }
    return 0;
}

void bkt(int k)
{
    int i, oldx;
    if(k == cnt + 1)
    {
        diviz[nrdiv] = x;
        //printf("%d ", x);
        nrdiv++;
    }
    else
    {
        bkt(k + 1);
        oldx = x;
        for(i = 1; i <= p[k]; ++i)
        {
            x *= d[k];
            bkt(k + 1);
        }
        x = oldx;
    }
}