Cod sursa(job #2774669)

Utilizator hurjui12AlexandruHurjui Alexandru-Mihai hurjui12Alexandru Data 12 septembrie 2021 11:49:55
Problema Descompuneri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
using namespace std;
 
ifstream fin ("desc.in");
ofstream fout ("desc.out");
 
long long d[10001], dp[10001];
unordered_map <long long, int> u;
 
void pune_dp (int ind)
{
	if (ind > d[0])
		return;
	int i;
	long long lim = d[d[0]]/d[ind];
	for (i = 1; lim >= d[i]; i++)
		if (u.find (d[i] * d[ind]) != u.end())
			dp[u[d[i]*d[ind]]] += dp[i];
}

void sterge_dp (int ind)
{
	if (ind > d[0])
		return;
	int i;
	long long lim = d[d[0]]/d[ind];
	for (i = d[0]; i>=1; i--)
		if (d[i] <= lim && u.find (d[i] * d[ind]) != u.end())
			dp[u[d[i] * d[ind]]] -= dp[i];
}
 
void calc_dp ()
{
	int i;
	dp[1] = 1;
	for (i = d[0]; i>=2; i--)
		pune_dp (i);
}
 
int main()
{
	long long n, k, nr;
	int i, j;
 
	fin >> n >> k;
	for (i = 1; 1ll*i*i < n; i++)
		if (n % i == 0)
		{
			d[++d[0]] = i;
			d[++d[0]] = n/i;
		}
	
	if (1ll * i * i == n)
		d[++d[0]] = i;
	
	sort(d+1, d+d[0]+1);
	for (i = 1; i<=d[0]; i++)
		u[d[i]] = i;
	
	calc_dp ();
	fout << dp[d[0]] << '\n';
	
	i = 2;
	k--;
	while (n > 1)
	{
		nr = dp[u[n]];
		sterge_dp (i);
		nr = nr - dp[u[n]];
		
		if (k >= nr)
		{
			k = k - nr;
			i++;
		}
		else
		{
			fout << d[i] << ' ';
			pune_dp (i);
			n = n / d[i];
		}
	}
	return 0;
}