Cod sursa(job #1765955)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 27 septembrie 2016 10:21:32
Problema Descompuneri Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define MaxD 10000
using namespace std;
 
long long N,D[MaxD],K;
int mat[MaxD][MaxD],d;
int F(int &X,int div1,int div2)
{
	while(D[X]<div1/div2)
		X++;
	if(D[X]>div1/div2)X--;
	return X;
}
int NF(int &X,int div1,int div2)
{
	while(D[X]>div1/div2)
		X--;
	if(D[X]<div1/div2)X++;
	return X;
}
int main()
{
    freopen("desc.in","r",stdin);
    freopen("desc.out","w",stdout);
     
	scanf("%lld%lld",&N,&K);
	for(long long i=2;i*i<=N;i++)
		if(N%i==0)D[++d]=i,D[++d]=N/i;
	if(D[d]==D[d-1])d--;
	D[++d]=N;
	sort(D+1,D+1+d);
	for(int i=1;i<=d;i++)
		mat[0][i]=1;
	for(int i=1;i<=d;i++)
	{
		int X=0;
		for(int j=d;j>0;j--)
		{
			mat[i][j]=mat[i][j+1];
			if(D[i]%D[j]==0)
				mat[i][j]+=mat[F(X,D[i],D[j])][j];
		}
	}
	printf("%d \n",mat[d][1]);
	int ind=d,div=1;
	while(ind>0&&N>1)
	{
		while(K>mat[ind][div]-mat[ind][div+1])K-=mat[ind][div]-mat[ind][div+1],div++;
		printf("%lld ",D[div]);
		ind=NF(ind,N,D[div]);
		N/=D[div];	
	}
    return 0;
}