Cod sursa(job #36535)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 23 martie 2007 18:02:19
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
# include <stdio.h>

# define  _fin  "desc.in"
# define  _fout "desc.out"

# define  maxd	3001

# define  myint	long long


myint dvz[maxd], n, k, nd;
myint sol[maxd], la[maxd], lb[maxd];
int a[maxd][maxd];

void presolve()
{
	myint d, i;
	
	for (d=2; n/d>d; d++)
		if ( !(n%d) ) la[++la[0]]=d, lb[++lb[0]]=n/d;
	for (i=1; i<=la[0]; i++) dvz[++nd] = la[i];
	if ( d*d==n ) dvz[++nd]=d;
	for (i=lb[0]; i>=1; i--) dvz[++nd] = lb[i];
	dvz[0]=1, dvz[++nd]=n;
}

myint poz(myint x)
{
	myint i, step;
	for (step=1; step<=nd; step<<=1); step>>=1;
	for (i=0; step; step>>=1)
		if ( i+step <= nd )
		if ( dvz[i+step]<=x ) i+=step;
	return i;
}

void solve()
{
	myint i, j, aux, x;
	for (i=0; i<=nd; i++) a[0][i]=1;
	for (i=1; i<=nd; i++)
		for (j=nd; j>=1; j--) {
			a[i][j] = a[i][j+1];
			if ( !( dvz[i]%dvz[j] ) )
				a[i][j] += a[poz(dvz[i]/dvz[j])][j];
		}
	
	for (x=n, i=1; x!=1; )
	{
		for (; i<=nd; i++)
			if ( !(x%dvz[i]) ) {
			aux = a[ poz(x/dvz[i]) ][i];
			if ( aux < k )
				k-=aux;
			else {
				sol[++sol[0]] = dvz[i], x/=dvz[i];
				break;
			}
		}
	}
}

int main()
{
	freopen(_fin, "r", stdin);
	freopen(_fout,"w", stdout);
	scanf("%lld%lld", &n, &k);
	
	presolve();
	solve();
	printf("%d\n", a[nd][1]);
	int i;
	
	for (i=1; i<sol[0]; i++) printf("%lld ", sol[i]); printf("%lld\n", sol[i]);
	
	return 0;
}