Cod sursa(job #1397119)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 23 martie 2015 11:51:38
Problema Descompuneri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb

#include <fstream>
#include <algorithm>
#define dim 4000
using namespace std;
ifstream fin("desc.in");
ofstream fout("desc.out");
long long n,k,i,j,d[dim][dim],nrdiv,di[dim],l,c,nr;
int cautare(long long x)
{
    int st=1,dr=nrdiv,mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(di[mij]>x)
            dr=mij-1;
        else
            if(di[mij]<x)
                st=mij+1;
            else
                return mij;

    }
}
int main()
{
    fin>>n>>k;
    for(i=2;i*i<n;i++)
        if(n%i==0)
            di[++nrdiv]=i,di[++nrdiv]=n/i;
    if(i*i==n)
        di[++nrdiv]=i;
    di[++nrdiv] = n;
    sort(di+1,di+nrdiv+1);
    for(i=1;i<=nrdiv;i++)
    {
        d[i][i]=1;
        for(j=i-1;j>=1;j--)
        {
            d[i][j]=d[i][j+1];
            if(di[i]%di[j]==0)
            {
                d[i][j]+=d[cautare(di[i]/di[j])][j];
            }
        }
    }
    fout<<d[nrdiv][1]<<'\n';
    l=nrdiv;
    c=1;
    nr=di[nrdiv];
    while(l>1)
    {
        if(d[l][c]-d[l][c+1]<k)
        {
            k-=(d[l][c]-d[l][c+1]);
            c++;
        }
        else
        {
            fout<<di[c]<<' ';
            nr/=di[c];
            l=cautare(nr);
        }
    }

 return 0;


}