Cod sursa(job #356617)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 15 octombrie 2009 17:07:32
Problema Descompuneri Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <cstdio>
#define lm 1000

int d[lm], v[lm][lm], n, m, l, x;

void afisare (int p, int k)
{
	int c, i, j;
	if (p) 
	{
		for (i=k; v[p][i]-v[p][i+1]<m && i<=n; m-=v[p][i]-v[p][i+1], i++);
		c=d[p]/d[i];
		for (j=0; j<=n; j++) 
			if (d[j]==c) break;
		printf("%d ",d[i]);
		afisare(j,i);
	}
}
		

int main()
{
	freopen("desc.in","r",stdin);
	freopen("desc.out","w",stdout);
	scanf("%d %d",&n,&m);
	int i, j;
	for (i=2; i*i<=n; i++)
		if (!(n%i)) 
		{
			l++;
			d[l]=i;
		}
	if (d[l]*d[l]==n)
	{
		for (i=l+1; i<=2*l-1; i++) d[i]=n/d[l-(i-l)];
		l=2*l-1;
	} else
	{
		for (i=l+1; i<=2*l; i++) d[i]=n/d[l-i+l+1];
		l=2*l;
	}
	l++;
	d[l]=n;
	int p;
	for (i=1; i<=l; i++)
	{
		v[i][i]=1;
		p=1;
		for (j=i-1; j>0; j--) 
		{
			v[i][j]=v[i][j+1];
			if (!(d[i]%d[j]) && d[i]/d[j]>=d[j]) 
			{
				if (p<j) p=j;
				for (; d[p]!=d[i]/d[j]; p++);
				v[i][j]+=v[p][j];
			}
		}
	}
	printf("%d\n",v[l][1]);
	x=0;
	d[0]=1;
	afisare(l,1);	
}