Cod sursa(job #2405648)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 14 aprilie 2019 18:37:47
Problema Descompuneri Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <fstream>
#include <algorithm>
#define DIM 1000
using namespace std;

ifstream fin ("desc.in");
ofstream fout ("desc.out");
long long n,d,nr;
long long dp[DIM][DIM],v[DIM];
int k,i,j,st,dr,mid,dv;
int main (){

    fin>>n>>k;
    for (d=2;d<=n/d;d++){
        if (n%d == 0){
            v[++dv] = d;
            if (n/d != d)
                v[++dv] = n/d;
        }
    }
    v[++dv] = n;
    sort (v+1,v+dv+1);
    for (i=1;i<=dv;i++)
        dp[0][i] = 1;
    /// d[i][j] - in cate moduri pot obtine divizorul v[i] folosind doar divizorii j,..,dv
    for (i=1;i<=dv;i++){
        for (j=dv;j;j--){
            dp[i][j] = dp[i][j+1];
            if (i == j)
                dp[i][j] = 1;
            if (v[i] % v[j] == 0){
                nr = v[i]/v[j];
                st = 1, dr = dv;
                while (st <= dr){
                    mid = (st+dr)/2;
                    if (v[mid] == nr)
                        break;
                    if (v[mid] < nr)
                        st = mid+1;
                    else dr = mid-1;
                }

                dp[i][j] += dp[mid][j];

            }
        }
    }

    fout<<dp[dv][1]<<"\n";

    i = 1;
    for (;;){

        for (;i<=dv;i++){
            if (n%v[i] != 0)
                continue;
            nr = n/v[i];
            st = 0, dr = dv;
            while (st <= dr){
                mid = (st+dr)/2;
                if (v[mid] == nr)
                    break;
                if (v[mid] < nr)
                    st = mid+1;
                else dr = mid-1;
            }
            if (dp[mid][i] < k)
                k -= dp[mid][i];
            else {
                fout<<v[i]<<" ";
                n /= v[i];
                break;
            }
        }
        if (n == 1)
            break;

        /*st = 1, dr = dv;
        while (st <= dr){
            mid = (st+dr)/2;
            if (v[mid] == n)
                break;
            if (v[mid] < n)
                st = mid+1;
            else dr = mid-1;
        }

        i = 1;
        while (dp[mid][i] > k)
            i++;
        k -= dp[mid][i];
        fout<<v[i]<<" ";
        n /= v[i];
        if (n == 1)
            break;*/
    }

    return 0;
}