Cod sursa(job #968422)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 2 iulie 2013 00:32:43
Problema NumMst Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<stdio.h>
#include<cmath>

#define maxdim 3165
#define maxprimes 500

FILE*f=fopen("nummst.in","r");
FILE*g=fopen("nummst.out","w");

const double inf_double = (1LL<<62);
int n;
int pr[maxprimes],ciur[maxdim],T[maxprimes][maxdim],sol[maxdim];
double D[2][maxdim];

int main () {
	
	fscanf(f,"%d",&n);
	
	int factor = 0,cmmdc = 0;
	for ( int i = 2 ; i*i <= n ; ++i ){
		if ( n%i == 0 ){
			factor = i,cmmdc = n/i;
			break ;
		}
	}
	
	n /= cmmdc;
	for ( int i = 2 ; i < n ; ++i ){
		
		if ( !ciur[i] ){
			pr[++pr[0]] = i;
			
			for ( int j = i+i ; j < n ; j += i ){
				ciur[j] = 1;
			}
		}
	}
	
	int p = 0;
	for ( int i = 1 ; i <= pr[0] ; ++i ){
		double lg = log((double)pr[i]);
		
		for ( int j = 0 ; j <= n ; ++j ){
			
			int s = 1;
			for ( int power = 0 ; j+s <= n ; ++power ){
				if ( D[p][j] + power*lg > D[1-p][j+s] ){
					D[1-p][j+s] = D[p][j] + power*lg;
					T[i][j+s] = power;
				}
				s *= pr[i];
			}
		}
		
		p = 1-p;
	}
	
	int sum = n; p = pr[0];
	while ( sum && p >= 1 ){
		int power = T[p][sum];
		if ( !power ){
			--p;
			continue ;
		}
		
		int scad = 1;
		for ( int i = 1 ; i <= power ; ++i )	scad *= pr[p];
		
		sol[++sol[0]] = cmmdc*scad;
		sum -= scad; --p;
	}
	
	for ( int i = 1 ; i <= sum ; ++i ){
		sol[++sol[0]] = cmmdc;
	}
	
	for ( int i = 1 ; i <= sol[0] ; ++i ){
		fprintf(g,"%d ",sol[i]);
	}
	fprintf(g,"\n");
	
	fclose(f);
	fclose(g);
	
	return 0;
}