Cod sursa(job #532529)

Utilizator lacalutlacalut lacalut Data 11 februarie 2011 21:07:46
Problema Descompuneri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <math.h>

#define ll long long
#define MAX 3000
#define pb push_back
#define mp make_pair

using namespace std;

ll n, k, rez;
vector <ll> vctDiv;
int vctSol[MAX][MAX];

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

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

	vctDiv.pb(n);

	int rad = sqrt((long double) n);
	for (int i = 2; i <= rad; i++)
		if (n % i == 0)
		{
			vctDiv.pb(i);
			if (i != rad)
				vctDiv.pb(n / i);
		}
	int m = vctDiv.size();
		
	sort(vctDiv.begin(), vctDiv.end());

	for (int i = 0; i < m; i++)
	{
		int r = 0;
		for (int j = m - 1; j >= 0; j--)
		{
			vctSol[i][j] = vctSol[i][j + 1];

			if (vctDiv[i] % vctDiv[j] == 0)
			{
				for (; vctDiv[r] < vctDiv[i] / vctDiv[j]; r++);

				vctSol[i][j] += vctSol[r][j];
			}

			if (i == j)
				vctSol[i][j]++;
		}
	}

	printf("%d\n", vctSol[m - 1][0]);

	int l = m - 1;
	for (int i = 0; n > 1 && i < m; )
		if (vctSol[l][i] - vctSol[l][i + 1] >= k)
		{
			printf("%lld ", vctDiv[i]);

			n /= vctDiv[i];
			if (n > 1)
				for (; vctDiv[l] > n; l--);
		}
		else k -= vctSol[l][i] - vctSol[l][i + 1], i++;

	fclose(stdin);
	fclose(stdout);
	return 0;
}