Cod sursa(job #732601)

Utilizator danalex97Dan H Alexandru danalex97 Data 10 aprilie 2012 18:29:11
Problema Descompuneri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

const int NMAX = 4000;

long long N;
int K, NF;
long long F[NMAX];
int DP[NMAX][NMAX];

void read()
{
	FILE *fin = fopen("desc.in", "rt");

	fscanf(fin, " %lld %d", &N, &K);

	fclose(fin);
}

void factori()
{
	double val=N;
	int dist=int (sqrt(val) )+1; 
	
	for (int i=1;i<=dist;++i)
		if ( N%i==0 )
			F[++NF]=i;
	if ( F[NF]!=N/F[NF] ) 
		F[++NF]=N/F[NF-1];
	for (int i=NF-1;i>0;--i)
		F[++NF]=N/F[i];
}

void dinamica() 
{
	int i, j, k;
	long long stop;

	for (i = 0; i < NF; ++i)
		DP[0][i] = 1;

	for (i = 1; i < NF; ++i) 
	{
		
		k = 0;

		for (j = NF - 1; j; --j) 
		{
			
			DP[i][j] = DP[i][j + 1];

			if (F[i] % F[j] == 0) 
			{

				for (stop = F[i] / F[j]; F[k] < stop; ++k);

				DP[i][j] += DP[k][j];
			}
		}
	}
}

void write() 
{
	FILE *fout = fopen("desc.out", "wt");

	fprintf(fout, "%d\n", DP[NF - 1][1]);

	int i, j;
	long long d;
	
	i = 1; j = NF - 1;
	while (N > 1) 
	{
		while (N % F[i]) ++i;
		d = N / F[i];
		while (F[j] > d) --j;

		if (DP[j][i] < K)
			K -= DP[j][i++];
		else 
		{
			fprintf(fout, "%lld ", F[i]);
			N /= F[i];
		}
	}

	fprintf(fout, "\n");


	fclose(fout);
}

int main() 
{
	
	read();

	factori();

	dinamica();

	write();

	return 0;
}