Cod sursa(job #613172)

Utilizator crushackPopescu Silviu crushack Data 17 septembrie 2011 15:37:15
Problema Descompuneri Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <vector>
using namespace std;

const char IN[]="desc.in",OUT[]="desc.out";
const int mod= 131072 , mmod=mod-1;
const int prime = 31;

struct problem{
	long long x,d,res;
};

long long N,K,R;
vector<problem> H[mod];

int key(long long x,long long d){
	return ((13*x+27*d)*prime)&mmod;
}

void add(long long x,long long d,long long res)
{
	static problem s;
	s.x=x;s.d=d;s.res=res;
	H[key(x,d)].push_back(s);
}

int get(long long x,long long d)
{
	int k=key(x,d);
	for (int i=0;i<(int)H[k].size();++i) if (H[k][i].x==x && H[k][i].d==d)
		return H[k][i].res;
	return -1;
}

int solve(long long x,long long d)
{
	int ret;long long sd;
	static problem p;
	if (x==1) return 0;
	ret=get(x,d);
	if (ret!=-1) return ret;
	sd=d;

	ret=(x>=d);
	for (;d*d<=x;++d) if (x%d==0)
		ret+=solve(x/d,d);
	add(x,sd,ret);
	return ret;
}

int main()
{
	int d;
	freopen(IN,"r",stdin);
	scanf("%lld%lld",&N,&K);
	fclose(stdin);


	freopen(OUT,"w",stdout);
	R=solve(N,2);
	printf("%lld\n",R);

    d=2;
	while (K>0)
	{
		if (N%d==0)
		{
		    if (N==d) break;
			int r=solve(N/d,d);
			if ( K > r ) K-=r,++d;
			else printf("%d ",d),N/=d;
		}
		else ++d;
	}
	if (N!=1) printf("%lld\n",N);
	return 0;
}