Cod sursa(job #573554)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 6 aprilie 2011 12:59:12
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define ll long long
#define maxn 3010
using namespace std;

vector <ll> v;
ll N;
int K, n, idx, dp[maxn][maxn];
int main ()
{


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


	scanf ("%lld %d\n", &N, &K);

	for (ll i = 2; i * i <= N; i++)
		if (N % i == 0) {
			
			v.push_back (i);
			if (i * i != N)
				v.push_back (N / i);
		}
	v.push_back (N);
	sort (v.begin (), v.end ());
		
	n = v.size ();
	
	for (int i = 0; i < n; i++) {
		
		idx = 0;
		for (int j = n - 1; j >= 0; j--) {

			dp[i][j] = dp[i][j + 1];
			
			if (v[i] % v[j] == 0) {
				
				while (v[idx] < v[i] / v[j])
					++idx;
				dp[i][j] += dp[idx][j];
			}
			
			if (i == j) dp[i][j] += 1;
		}
	}
	
	printf ("%d\n", dp[n - 1][0]);
	
	int ind = n - 1;
	
	for (int i = 0; N > 1 && i < n; )
		if (dp[ind][i] - dp[ind][i + 1] >= K) {
			
			printf ("%lld ", v[i]);
			N /= v[i];
			
			if (N > 1)
				while (v[ind] > N)
					ind--;
		} else {
			K -= dp[ind][i] - dp[ind][i + 1];
			i++;
		}
	
	return 0;
}