Cod sursa(job #585757)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 30 aprilie 2011 11:39:39
Problema NumMst Scor 10
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.3 kb
#include <stdio.h>
#include <math.h>
#define NMAX 4005
#define LMAX 555
int n,m,A[NMAX],r,sol[NMAX],t;
int use[LMAX][NMAX],tip[NMAX];
double best[LMAX][NMAX];
inline int prim(int x)
{
	if (x==1)
		return 0;
	if (x==2)
		return 1;
	if (x % 2==0)
		return 0;
	int i;
	for (i=3; i*i<=x; i+=2)
		if (x%i==0)
			return 0;
	return 1;
}
void reconst(int nr,int val)
{
	if (nr==0 || val==0)
		return ;
	sol[++t]=use[nr][val];
	reconst(nr,val-use[nr][val]);
}
int main()
{
	freopen("nummst.in","r",stdin);
	freopen("nummst.out","w",stdout);
	scanf("%d",&n);
	int i,s=0;
	for (i=2; i*i<=n; i++)
		if (n%i==0)
		{
			m=i;
			break ;
		}
	for (i=2; i<m; i++)
		if (prim(i))
			A[++r]=i;
	int j,k,st,cnt;
	double val;
	for (i=1; i<=r; i++)
	{
		for (j=0; j<=m; j++)
		{
			best[i][j]=best[i-1][j];
			use[i][j]=use[i-1][j];
		}
		val=log10(A[i]);
		for (j=0; j<=m; j++)
		{
			st=1; cnt=0;
			while (1)
			{
				st*=A[i]; cnt++;
				if (j+st>m)
					break ;
				tip[st]=i;
				if (best[i][j+st]<best[i-1][j]+val*cnt)
				{
					best[i][j+st]=best[i-1][j]+val*cnt;
					use[i][j+st]=st;
				}
			}
		}
	}
	reconst(r,m);
	for (i=1; i<=t; i++)
	{
		s+=sol[i];
		printf("%d ",n/m*sol[i]);
	}
	for (i=1; i<=m-s; i++)
		printf("%d ",n/m);
	printf("\n");
	return 0;
}