Cod sursa(job #2478121)

Utilizator luciocfLucio Cardoso Dias de Figueiredo Filho luciocf Data 21 octombrie 2019 18:00:53
Problema Descompuneri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll n, k;

ll dp[4500][4500];

map<ll, int> ord;

vector<ll> dd;

void get(void)
{
	for (int i = 1; 1ll*i*i <= n; i++)
	{
		if (n%i) continue;

		dd.push_back(i);
		if (n/i != i) dd.push_back(n/i);
	}

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

	for (int i = 0; i < dd.size(); i++)
		ord[dd[i]] = i;
}

ll solve(int a, int b)
{
	if (a == dd.size() && b != 0) return 0;
	if (b == 0) return 1;
	if (dp[a][b] != -1) return dp[a][b];

	ll ans = solve(a+1, b);

	if (dd[b]%dd[a] == 0)
		ans += solve(a, ord[dd[b]/dd[a]]);

	return dp[a][b] = ans;
}

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

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

	get();

	memset(dp, -1, sizeof dp);

	printf("%lld\n", solve(1, dd.size()-1));

	ll prod = 1;
	int ant = 1;

	vector<ll> ans;

	while (prod != n)
	{
		for (int i = ant; i < dd.size(); i++)
		{
			if (prod*dd[i] > n || (n%(prod*dd[i]) != 0)) continue;

			ll x = solve(i, ord[n/(prod*dd[i])]);

			if (x >= k)
			{
				ans.push_back(dd[i]);
				prod *= dd[i];
				ant = i;
				break;
			}
			else k -= x;
		}
	}

	printf("%lld", ans[0]);
	for (int i = 1; i < ans.size(); i++)
		printf(" %lld", ans[i]);
	printf("\n");
}