Cod sursa(job #2478194)

Utilizator luciocfLucio Cardoso Dias de Figueiredo Filho luciocf Data 21 octombrie 2019 19:05:22
Problema Descompuneri Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll n;
int k, aux = -1;

int dp[4001][4001];

map<ll, int> ord;

ll dd[7000];

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

		dd[++aux] = i;
		if (n/i != i) dd[++aux] = n/i;
	}

	++aux;

	sort(dd, dd+aux);

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

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

	int 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 %d", &n, &k);

	get();

	memset(dp, -1, sizeof dp);

	printf("%d\n", solve(1, aux-1));

	ll prod = 1;
	int ant = 1;

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

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

			if (x >= k)
			{
				printf("%lld ", dd[i]);
				prod *= dd[i];
				ant = i;
				break;
			}
			else k -= x;
		}
	}

	printf("\n");
}