Cod sursa(job #573813)

Utilizator DraStiKDragos Oprica DraStiK Data 6 aprilie 2011 16:34:40
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <algorithm>
using namespace std;

#define DIM 5005

long long dvz[DIM];
int bst[DIM][DIM];
long long N;
int K,M;

void init ()
{
    long long i;

    scanf ("%lld%d",&N,&K);

    for (i=2; i*i<N; ++i)
        if (N%i==0)
        {
            dvz[++M]=i;
            dvz[++M]=N/i;
        }
    if (i*i==N)
        dvz[++M]=i;
    dvz[0]=1; dvz[++M]=N;

    sort (dvz,dvz+M+1);
}

void solve ()
{
    int i,j,k;

    for (i=1; i<=M; ++i)
        bst[0][i]=1;

    for (i=1; i<=M; ++i)
    {
        k=0;
        for (j=M; j>=1; --j)
        {
            bst[i][j]=bst[i][j+1];
            if (dvz[i]%dvz[j]==0)
            {
                for ( ; dvz[k]<dvz[i]/dvz[j] && k<=M; ++k);
                bst[i][j]+=bst[k][j];
            }
        }
    }
}

void print ()
{
    int i,j,k;

    printf ("%d\n",bst[M][1]);
    j=1;
    for (i=M; i>=1; )
    {
        for (k=M; j<=M; ++j)
            if (dvz[i]%dvz[j]==0)
            {
                for ( ; dvz[k]>dvz[i]/dvz[j] && k>=1; --k);

                if (bst[k][j]<K)
                    K-=bst[k][j];
                else
                {
                    printf ("%lld ",dvz[j]);
                    i=k;

                    break ;
                }
            }
    }
}

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

    init ();
    solve ();
    print ();

    return 0;
}