Cod sursa(job #750095)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 20 mai 2012 19:56:17
Problema Descompuneri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;

ifstream in("descompuneri.in");
ofstream out("descompuneri.out");

const int N = 3000;

vector<long long> v;
long long n;
int k, t, d[N][N];

int main() {
    int i,j;

    in >> n >> k;

    for(i = 2; i*i <= n; ++i)

        if(!(n % i)) {
            v.push_back(i);

            if(i*i != n)
                v.push_back(n / i);
        }
    v.push_back(n);

    sort(v.begin(), v.end());

    for(i = 0; i!=v.size(); ++i) {

        t = 0;

        for(j = v.size() - 1; j >= 0; --j) {

            d[i][j] = d[i][j + 1];

            if(i == j)
                d[i][j] += 1;

            if(v[i] % v[j])
                continue;

            while(v[t] < v[i] / v[j])
                ++t;

            d[i][j] += d[t][j];
        }
    }

    out << d[v.size() - 1][0] << "\n";

    t = v.size() - 1;

    for(i = 0; n != 1 && i!=v.size();) {
        if(d[t][i] - d[t][i + 1] >= k) {
             out << v[i] << " ";

             n /= v[i];

             if(n!=1)
                while(v[t] > n)
                    --t;
        }
        else {
            k -= d[t][i] - d[t][i + 1];
            ++i;
        }
    }

    return 0;
}