Cod sursa(job #73693)

Utilizator peanutzAndrei Homorodean peanutz Data 20 iulie 2007 14:23:01
Problema Descompuneri Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>
#include <math.h>
#include <algorithm>

using namespace std;

#define NMAX 1500

long long n;
int k;
long long d[NMAX*100];
int h = -1;
int a[NMAX][NMAX];
int last[NMAX][NMAX];

int aux;

int sir(int x)
{
    int i;
    for(i = 0; i <= h; ++i)
	  if(x == d[i])
	       return 1;
    return 0;
}

void findDiv()
{
	int i, ok, j, until = (int)sqrt(n)+1;
	d[++h] = 1;

	if(!(n%2))
		d[++h] = 2;

	for(i = 3; i <= until; ++i)
		if(!(n%i))
			d[++h] = i;

    aux = h;
    for(i = 1; i <= aux; ++i)
	  for(j = i; j <= aux; ++j)
                if(d[i]*d[j] < n && !(n % (d[i]*d[j])) && !sir(d[i]*d[j]))
                             d[++h] = d[i]*d[j];

    d[++h] = n;
}

int binarySearch(long long x)
{
	int st = 0, dr = h, m;
	dr = aux;
	while(st <= dr)
	{
		m = (st+dr) / 2;
		if(d[m] > x)
			dr = m-1;
		else if(d[m] < x)
			st = m+1;
		else
			return m;
	}
	return -1;
}

void buildNr()
{
	int i, j, res, k = 0;

	k = 0;
	for(j = 1; j <= h; ++j)
		++a[0][j];//, last[0][j] = 0;

	for(i = 1; i <= h; ++i)
	{
		//k = 1;
		for(j = h; j; --j)
		{
			a[i][j] = a[i][j+1];

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


			res = d[i]/d[j];
			for(k = last[i-1][j]; d[k] != res; ++k);
			last[i][j] = k;

			if(!(d[i]%d[k]))
			{
				a[i][j] += a[k][j];

			}
		}
	}
}


int main()
{
	freopen("desc.in", "r", stdin);
	freopen("desc.out", "w", stdout);

	scanf("%lld%lld", &n, &k);

	findDiv();

	//h = aux;


    //return 0;

	buildNr();

	printf("%d\n", a[h][1]);
   // printf("%d\n", h);


	int i, aux;
	int crt = h;
	while(n != 1 && n != 0)
	{
		for(i = 1; i <= h && n != 1; ++i)
		{
			if((n % d[i]))
				continue;
			aux = last[ crt ][ i ];

			if(a[ aux ][i] >= k)
			{
				printf("%d ", d[i]);

				crt = aux;

				n /= d[i];
				--i;
			}
			else
				k -= a[ aux ][i];
		}
	}

   // printf("\n\n");
    //for(i = 1; i <= h; ++i)
      //      printf("%d ", d[i]);


	return 0;
}