Cod sursa(job #1039518)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 23 noiembrie 2013 10:51:15
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <algorithm>
#include <map>

using namespace std ;
map < long long ,int > HASH;
const char In[]="desc.in";
const char Out[]="desc.out";
long long n,dp[4100][4100] , v[4100];
int k, nr;
inline void Read()
{
    ifstream f(In);
    f >> n >> k;
    f.close();
}

inline void Desc(const long long n)
{
    long long i;
    for(i = 1;1LL*i*i<n; ++i)
        if(n%i==0)
        {
            v[++v[0]] = i;
            v[++v[0]] = n/i;
        }
    if(1LL*i*i==n)
        v[++v[0]] = i;
}

inline void Solve()
{
    int i , j ,s;
    nr = v[0];
    sort(v+1,v+nr+1);
    for(i = 1 ;i <= nr; ++i)
        HASH[v[i]] = i;
    for(i = 2;i <= nr;++i)
    {
        dp[i][i] = 1;
        for(j = i-1; j > 1;--j)
        {
            dp[i][j] = dp[i][j+1];
            if(v[i]%v[j]==0)
                dp[i][j]+=dp[HASH[v[i]/v[j]]][j];
        }
    }
    ofstream g(Out);
    g<<dp[nr][2]<<"\n";
    int p = 2, Last;
    i = nr;
    while(k)
    {
        s = 0;
        Last = 0;
        for(j = p;j <= nr; ++j)
        {
            if(v[i]%v[j]==0)
            {
                s += dp[i][j] - dp[i][j+1];
                if(s>=k)
                {
                    g<<v[j]<<" ";
                    s -= dp[i][j]- dp[i][j+1];
                    k -= s;
                    if(dp[i][j]==1)
                        --k;
                    i = HASH[v[i]/v[j]];
                    p = j;
                    break ;
                }
            }
        }
    }
    g<<"\n";
    g.close();
}

int main()
{
    Read();
    Desc(n);
    Solve();
    return 0;
}