Cod sursa(job #1279600)

Utilizator diana97Diana Ghinea diana97 Data 30 noiembrie 2014 17:02:06
Problema Descompuneri Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream f ("desc.in");
ofstream g ("desc.out");

const long long MAXIM = 3005;

long long n, k, nrdiv;
int divizor[MAXIM];
long long posibilitati[MAXIM][MAXIM]; //p[i][j] = numarul de posibilitati pentru a obtine divizorul i folosind divizorii j + 1, j + 2 etc

void initializeaza() {
    divizor[0] = 1;
    long long d = 2;
    for (d = 2; d * d < n; d++)
        if (n % d == 0) {
            divizor[++nrdiv] = d;
            divizor[++nrdiv] = n / d;
        }
    if (d * d == n) divizor[++nrdiv] = d;
    divizor[++nrdiv] = n;
    sort(divizor + 1, divizor + nrdiv + 1);
    for (long long i = 1; i <= nrdiv; i++) posibilitati[0][i] = 1;
}

void rezolva() {
    long long poz = 0, lim;
    for (long long i = 1; i <= nrdiv; i++) {
        poz = 0;
        for (long long j = nrdiv; j >= 1; j--) { //iau divizorii in ordine descrescatoare
            posibilitati[i][j] = posibilitati[i][j + 1];
            if (divizor[i] % divizor[j] == 0) {
                lim = divizor[i] / divizor[j];
                for (; divizor[poz] < lim; poz++);
                posibilitati[i][j] += posibilitati[poz][j];
            }
        }
    }
}


void scrie() {
    g << posibilitati[nrdiv][1] << '\n';
    long long poz, j = 1, lim;
    for (long long i = nrdiv; i >= 1; ) {
        poz = nrdiv;
        for (; j <= nrdiv; j++)
            if (divizor[i] % divizor[j] == 0) {
                lim = divizor[i] / divizor[j];
                for (; divizor[poz] > lim; poz--);
                if (posibilitati[poz][j] < k) k-= posibilitati[poz][j];
                else {
                    g << divizor[j] << ' ';
                    i = poz;
                    break;
                }
            }
    }
}

int main() {
    f >> n >> k;
    initializeaza();
    rezolva();
    scrie();
    return 0;
}