Cod sursa(job #21242)

Utilizator diaDiana Adrisor dia Data 23 februarie 2007 00:14:47
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <stdio.h>
#include <math.h>
#include <vector>
#include <algorithm>
#include <string.h>
#define NMAX 4020

using namespace std;

int A[NMAX][NMAX], Sol[NMAX];
long long N;
int K, M;
vector<long long> D;

int cb(long long x)
{
        int lo, hi, mid;

        for (lo = 0, hi = M, mid = (lo+hi)/2; lo <= hi; mid = (lo+hi)/2)
        {
                if (x == D[mid]) return mid;
                if (x < D[mid]) hi = mid-1;
                else lo = mid+1;
        }
        return -1;
}

int main()
{
        int i, j, rad, p, nsol = 0, t;
        long long ii;

        freopen("desc.in", "r", stdin);
        scanf("%lld %d", &N, &K);

        D.clear();
        memset(A, 0, sizeof(A));
        D.push_back(1);
        for (ii = 2; ii*ii <= N; ii++)
            if (N%ii == 0) {D.push_back(ii);
            if (N/ii != ii) D.push_back(N/ii); }

        D.push_back(N);
        sort(D.begin(), D.end());
        M = D.size();

        for (i = 0; i < M; i++) A[0][i] = 1;

        for (i = 1; i < M; i++)
            {
                for (j = i; j > 0; j--)
                {
                    A[i][j] = A[i][j+1];
                    p = -1;
                    if (D[i]%D[j] == 0)
                       p = cb(D[i]/D[j]);
                    if (p >= 0) A[i][j] += A[p][j];
                }
            }

        freopen("desc.out", "w", stdout);
        printf("%d\n", A[M-1][1]);

        p = M-1;
        for (i = 1; i < M; i++)
            if (N%D[i] == 0)
            {
                p = cb(N/D[i]);
                if (p == -1) break;
                if (A[p][i] >= K) { Sol[nsol++] = D[i]; N /= D[i]; i--; }
                else K-=A[p][i];
            }

        for (i = 0; i < nsol; i++) printf("%d ", Sol[i]);
        printf("\n");

        return 0;
        
}