Cod sursa(job #956810)

Utilizator ayakutAlperen Yakut ayakut Data 3 iunie 2013 21:55:42
Problema NumMst Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
queue <int> q;
int P[500];
int p;
int N;
int gg,ss;
double dp[500][500];
vector <int> vec;
bool isPrime(int x)
{
    for(int i=0; i < p && P[i] * P[i] <= x;i++)
    {
        if((x%P[i]) == 0) return 0;
    }
    return 1;
}
double solve(int k,int s)
{
	if(k==p || !s) return 0;
	double &ret = dp[k][s];
	if(ret != -1) return ret;
	int t=P[k];
	ret=solve(k+1,s);
	for(;t < s && t != ss;t*=P[k])
	{
		ret=max(ret,log10(t)+solve(k+1,s-t));
	}
	return ret;
}
void write(int k,int s)
{
	if(!s) return;
	if(k==p)
	{
		while(s--) vec.push_back(gg);
		return;
	}
	int t=P[k];
	int tt;
	double res=solve(k,s);
	if(res==solve(k+1,s)) write(k+1,s);
	else
	{
		for(;t < s && t != ss;t*=P[k])
		{
			if(log10(t) + solve(k+1,s-t) == res)
			{
				tt=t;
				while(tt > 1)
				{
					vec.push_back(gg*P[k]);
					tt/=P[k];
				}
				write(k+1,s-t);
				return;
			}
		}
	}
}
void mem()
{
	while(1) q.push(2);
}
int main()
{
    freopen("nummst.in","r",stdin);
    freopen("nummst.out","w",stdout);
     
     
    scanf(" %d",&N);
    
    for(int i=2;;i++)
    {
        if(!(N%i))
        {
            ss=i;
            gg=N/i;
            break;
        }
    }
    for(int i=2;i<=ss;i++)
        if(isPrime(i)) P[p++]=i; 
	for(int i=0;i<500;i++)
		for(int j=0;j<500;j++)
			dp[i][j]=-1;
	solve(0,ss);
	write(0,ss);
	if(vec.size() < 4) mem();
	for(int i=0;i<(int)vec.size();i++)
		printf("%d ",vec[i]);
	printf("\n");
	return 0;
}