Cod sursa(job #1397182)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 23 martie 2015 12:27:18
Problema Descompuneri Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <algorithm>

#define NMax 4001

using namespace std;

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

long long n, k, divis[NMax], d[NMax][NMax], nd, l;

void findDiv()
{
    int i;
    for (i=2; i * i < n; i++) {
        if (n % i == 0) {
            divis[++nd] = i;
            divis[++nd] = n / i;
        }
    }
    if (i * i == n)
        divis[++nd] = i;
    divis[++nd] = n;
}

int binsrc(int l, int r, long long val)
{
    int index;
    while (l <= r) {
        int mid = (l+r)>>1;
        if (divis[mid] == val) {
            index = mid;
            break;
        }
        else if (divis[mid] > val)
            r = mid - 1;
        else
            l = mid + 1;
    }

    return index;
}

int main()
{

    f>>n>>k;

    findDiv();
    sort(divis + 1, divis + nd + 1);

    for (int i=1; i <= nd; i++) {
        d[i][i] = 1;
        for (int j=i-1; j >= 1; j--) {
            if (divis[i] % divis[j] == 0) {
                int val = divis[i] / divis[j], ind = binsrc(1, nd, val);
                d[i][j] = d[i][j+1] + d[ind][j];
            }
            else
                d[i][j] = d[i][j+1];
        }
    }

    g<<d[nd][1]<<"\n";

    int line = nd, col=1;

    while (n != 1) {

        while (d[line][col] - d[line][col+1] < k) {
            k -= (d[line][col] - d[line][col+1]);
            col++;
        }

        g << divis[col] <<" ";
        line = binsrc(1, nd, n / divis[col]);
        n /= divis[col];

    }

    return 0;
}