Pagini recente » Cod sursa (job #886693) | Cod sursa (job #3180159) | Cod sursa (job #3030220) | Cod sursa (job #1914266) | Cod sursa (job #613172)
Cod sursa(job #613172)
#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;
}