Cod sursa(job #73687)

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

using namespace std;

#define NMAX 1000

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

int aux;

int sir(int h, 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 = 2, ok = 1; i <= n && ok; ++i)
	{
		ok = 0;
		for(j = 1; j <= aux; ++j)
			if(!(n % (i * d[j])) && !sir(h, i * d[j]))
				d[++h] = i * d[j], ok = 1;
	}
    d[++h] = n;
	aux = h;
	sort(d+1, d+h+1);
}

int binarySearch(long long x)
{
	int st = 0, dr = h, m;
	dr = aux;
	while(st <= dr)
	{
		m = (st+dr) >> 1;
		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;
    //for(int i = 1; i <= h; ++i)
    //printf("%d ", d[i]);
    //printf("\n");

    //return 0;
	buildNr();

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


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


	return 0;
}