Cod sursa(job #689505)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 24 februarie 2012 16:45:30
Problema Descompuneri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

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

int K,i,j,d;
long long Div[3005];
long long N,D[3005][3005];

int main () {
	
	fscanf(f,"%lld %d",&N,&K);
	
	for ( i = 1 ; 1LL * i * i <= N ; ++i ){
		if ( !(N % i) ){
			Div[++d] = i;
			if ( i != N/i ){
				Div[++d] = N / i;
			}
		}
	}
	
	sort(Div+1,Div+d+1);
	
	for ( i = 1 ; i <= d ; ++i ){
		D[1][i] = 1;
	}
	
	for ( i = 2 ; i <= d ; ++i ){
		for ( j = d ; j >= 1 ; --j ){
			int p = 1;
			if ( j < i ){
				if ( !(Div[i] % Div[j]) ){
					long long searched = Div[i] / Div[j];
					while ( p <= d && searched != Div[p] )	++p;
					D[i][j] = D[i][j+1] + D[p][j];
				}
				else{
					D[i][j] = D[i][j+1];
				}
			}
			else{
				if ( j == i ){
					D[i][j] = D[i][j+1] + 1;
				}
				else{
					D[i][j] = D[i][j+1];
				}
			}
		}
	}
	
	fprintf(g,"%lld\n",D[d][1]);
	
	long long P = N; long long maxd = 2;
	while ( P > 1 ){
		int p = d;
		for ( i = maxd ; i <= d ; ++i ){
			if ( !(P % Div[i]) ){
				long long searched = P / Div[i];
				while ( p > 0 && searched != Div[p] )	--p;
				if ( D[p][i] < K ){
					K -= D[p][i];
				}
				else{
					fprintf(g,"%d ",Div[i]);
					P /= Div[i]; maxd = i;
					break ;
				}
			}
		}
	}
	
	fprintf(g,"\n");
	
	fclose(f);
	fclose(g);
	
	return 0;
}