Cod sursa(job #2405740)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 14 aprilie 2019 20:15:15
Problema Descompuneri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <fstream>
#include <algorithm>
#define DIM 3005
using namespace std;

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

    fin>>n>>k;
    if (n == 1){
        fout<<"1\n1";
        return 0;
    }
    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);
    v[0] = 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++){
        poz = 0;
        for (j=i;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;
                }*/
                while (v[poz] < nr)
                    poz++;
                dp[i][j] += dp[poz][j];

            }
        }
    }

    fout<<dp[dv][1]<<"\n";
    //if (k > dp[dv][1])
        //return 0;
    i = dv, j = 1;
    while (n){
        while (dp[i][j] - dp[i][j+1] < k){
            k -= (dp[i][j] - dp[i][j+1]);
            j++;
        }
        fout<<v[j]<<" ";
        //n /= v[j];
        while (i >= 1 && v[i] > n/v[j])
            i--;
        n = v[i];
        if (i < 1)
            break;
    }
    /*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;

    }*/

    return 0;
}