Cod sursa(job #1691227)

Utilizator sucureiSucureiRobert sucurei Data 17 aprilie 2016 15:10:55
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <vector>
#define NrDivMax 4096

using namespace std;

long long N;
int K;
int dp[NrDivMax][NrDivMax];
int nrdiv;
long long v[NrDivMax];
vector <int> sol;

void Read()
{
    ifstream f ("desc.in");
    f>>N>>K;
    f.close();
}

void Desc()
{
    long long d;
    v[++nrdiv] = N;
    for (d = 2; d*d <= N; ++d)
    {
        if (N%d)
            continue;
        v[++nrdiv] = d;
        if (d*d < N)
            v[++nrdiv] = N/d;
    }
    sort(v+1, v+nrdiv+1);
}

inline int CautareBinara(const long long x)
{
    int st = 1, dr = nrdiv, mij;
    while (st <= dr)
    {
        mij = (st+dr)>>1;
        if (v[mij] == x)
            return mij;
        if (v[mij] < x)
            st = mij + 1;
        else
            dr = mij - 1;
    }
    return 0;
}

void Solve()
{
    Desc();
    cout<<"da";
    int i, j;
    for (i=1; i<=nrdiv; ++i)
        dp[i][i] = 1;
    for (i=2; i<=nrdiv; ++i)
    {
        for (j=i-1; j; --j)
        {
            dp[i][j] += dp[i][j+1];
            if (v[i] % v[j] == 0)
            {
                long long aux = v[i]/v[j];
                int poz = CautareBinara(aux);
                dp[i][j] += dp[poz][j];
            }
        }
    }

    while (K!=0)
    {
        int poz = CautareBinara(N);
        int sum = 0;
        int start = 1;
        if (!sol.empty())
            start = CautareBinara(sol.back());
        for (i=start; i<=poz; ++i)
        {
            int localsum = dp[poz][i] - dp[poz][i+1];
            sum = sum + localsum;
            if (sum >= K)
            {
                sum = sum - localsum;
                K -= sum;
                if (dp[poz][start] == 1)
                    --K;
                N = N / v[i];
                sol.push_back(v[i]);
                i = poz+1;
            }
        }
    }
}

void Write()
{
    ofstream g("desc.out");
    g<<dp[nrdiv][1]<<"\n";
    for (vector <int>::iterator it = sol.begin(); it != sol.end(); ++it)
        g<<*it<<" ";
    g<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}