Cod sursa(job #75386)

Utilizator sealTudose Vlad seal Data 1 august 2007 17:03:33
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<stdio.h>
#define Dm 3501
#define SqrtnM 1000001
int M[Dm][Dm],Poz[SqrtnM],k,d;
long long D[Dm],Ans[Dm],n;

void read()
{
    freopen("desc.in","r",stdin);
    scanf("%lld%d",&n,&k);
}

void solve()
{
    int i,j;

    for(i=1;(long long)i*i<=n;++i)
        if(n%i==0)
        {
            D[++d]=i;
            Poz[i]=d;
        }
    for(i=d-(D[d]*D[d]==n);i;--i)
        D[++d]=n/D[i];

    for(i=2;i<=d;++i)
    {
        M[i][i]=1;
        for(j=i-1;j>1;--j)
        {
            M[i][j]=M[i][j+1];
            if(D[i]%D[j]==0 && D[j]<=D[i]/D[j])
                if(D[i]/D[j]<=D[d+1>>1])
                    M[i][j]+=M[Poz[D[i]/D[j]]][j];
                else
                    M[i][j]+=M[d-Poz[n/(D[i]/D[j])]+1][j];
        }
    }

    i=d; j=2;
    while(1)
    {
        for(;M[i][j]-M[i][j+1]<k;++j)
            k-=M[i][j]-M[i][j+1];
        if(D[i]==D[j])
        {
            Ans[++Ans[0]]=D[j];
            break;
        }
        Ans[++Ans[0]]=D[j];
        if(D[i]/D[j]<=D[d+1>>1])
            i=Poz[D[i]/D[j]];
        else
            i=d-Poz[n/(D[i]/D[j])]+1;
    }
}
        
void write()
{
    int i;

    freopen("desc.out","w",stdout);
    printf("%d\n",M[d][2]);
    for(i=1;i<Ans[0];++i)
        printf("%lld ",Ans[i]);
    printf("%lld\n",Ans[i]);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}