Cod sursa(job #481090)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 30 august 2010 15:53:23
Problema Descompuneri Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <fstream>
#include <math.h>
#define LL long long
#define Dmax 200

using namespace std;

ifstream fin("desc.in");
ofstream fout("desc.out");

int A[Dmax][Dmax];
LL Div[Dmax];
int K;
LL N;

int main(){
	int i,j,st,lim,minim; LL cine;
	fin>>N>>K;
	
	for(i=1, lim=(int)sqrt((double)N); i<=lim; ++i)
		if( N % i == 0 ) Div[++Div[0]]=i;
	for(i=Div[0];i>=1;--i)
		if( N/Div[i] != Div[i] ) Div[++Div[0]]=N/Div[i];

	for(i=2;i<=Div[0];++i){
		st=1; A[i][i]=1;
		for(j=i-1; j>1; --j){
			A[i][j]=A[i][j+1];
			if( Div[i] % Div[j] == 0 ){

				while( Div[st] != Div[i]/Div[j] ) ++st;
				A[i][j] += A[st][j];
			}
		}
	}
	
	for(i=1;i<=Div[0];++i) A[1][i]=1;
	fout<<A[Div[0]][2]<<"\n";
	cine=Div[Div[0]]; // Div[cine]=N
	minim=2;
	while( cine!=1 ){
		st=Div[0];
		
		for(j=minim;j<=Div[0];++j)
		if( cine % Div[j] == 0 ){
			while( Div[st] != cine/Div[j] ) st--;
			if( A[st][j] < K ) K-=A[st][j];
			else{
				fout<<Div[j]<<" ";
				cine/=Div[j];
				minim=j;
				break;
			}
		}
	}
	
	fin.close(); fout.close();
	return 0;
}