Cod sursa(job #1397187)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 23 martie 2015 12:30:14
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 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()
{
    long long 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;
}

long long binsrc(long long l, long long r, long long val)
{
    long long index;
    while (l <= r) {
        long long 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 (long long i=1; i <= nd; i++) {
        d[i][i] = 1;
        for (long long j=i-1; j >= 1; j--) {
            if (divis[i] % divis[j] == 0) {
                long long 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";

    long long 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;
}