Cod sursa(job #752546)

Utilizator danalex97Dan H Alexandru danalex97 Data 28 mai 2012 20:57:03
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#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()
{
	int i, stop;

	stop = (int) sqrt((double) N);

	F[NF++] = 1;
	if (N > 1) F[NF++] = N;

	for (i = 2; i < stop; ++i)
		if (N % i == 0)
		{
			F[NF++] = i;
			F[NF++] = N / i;
		}
	
	if (stop > 1 && N % stop == 0) 
	{
		F[NF++] = stop;
		if (N / stop != stop)
			F[NF++] = N / stop;
	}

	sort(F, F + NF);
}

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() 
{
	ofstream G("desc.out");

	G<<DP[NF - 1][1]<<'\n';

	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 
		{
			G<<F[i]<<' ';
			N /= F[i];
		}
	}

	G<<'\n';
	G.close();
}

int main() 
{
	
	read();

	factori();

	dinamica();

	write();

	return 0;
}