Cod sursa(job #344982)

Utilizator de_la_mareMare Distanta de_la_mare Data 1 septembrie 2009 14:21:36
Problema Descompuneri Scor 12
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <map>

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

using namespace std;

ll n, k, rez;
vector <ll> vctDiv;
map <pair <ll, ll>, ll> sol;

inline ll solFct(ll nr, int st)
{
	if (nr == 1)
		return 1;
	if (sol[mp(nr, vctDiv[st])])
		return sol[mp(nr, vctDiv[st])];

	ll solT = 0;
	for (int i = st; i < vctDiv.size(); i++)
		if (nr % vctDiv[i] == 0)
			solT += solFct(nr / vctDiv[i], i);

	sol[mp(nr, vctDiv[st])] = solT;
	return solT;
}

inline void afis(ll n, int k, int st)
{
	for (int i = st; i < vctDiv.size(); i++)
		if (n % vctDiv[i] == 0)
			if (sol[mp(n, vctDiv[i])] < k)
				k -= sol[mp(n, vctDiv[i])];
			else
			{
				printf("%d ", vctDiv[i]);
				afis(n / vctDiv[i], k, i);

				break;
			}
}

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

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

	vctDiv.pb(n);

	for (int i = 2; i * i <= n; i++)
		if (n % i == 0)
		{
			vctDiv.pb(i);
			if (i * i != n)
				vctDiv.pb(n / i);
		}

	sort(vctDiv.begin(), vctDiv.end());

	for (int i = 0; i < vctDiv.size(); i++)
		sol[mp(vctDiv[i], vctDiv[i])] = 1;

	for (int i = 0; i < vctDiv.size(); i++)
	{
		sol[mp(n, vctDiv[i])] = solFct(n / vctDiv[i], i);

		rez += sol[mp(n, vctDiv[i])];
	}

	printf("%d\n", rez);

	afis(n, k, 0);

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