Pagini recente » Cod sursa (job #2772143) | Cod sursa (job #2151897) | Cod sursa (job #2140959) | Cod sursa (job #385701) | Cod sursa (job #53700)
Cod sursa(job #53700)
#include <stdio.h>
#define maxn 2048
#define ll long long
ll n;
int m,l,k;
int c[maxn][maxn],sum[maxn][maxn];
int a[maxn];
int sol[maxn];
int search(int x)
{
int front=1,middle,back=l,aux=0;
while (front<=back)
{
middle=(front+back)/2;
if (a[middle]>=x)
{
aux=middle;
back=middle-1;
}
else front=middle+1;
}
return aux;
}
int main()
{
freopen("desc.in","r",stdin);
freopen("desc.out","w",stdout);
scanf("%lld %d",&n,&m);
int i,aux,j,x;
for (i=1;1LL*i*i<=n;i++)
if (n%i==0) a[++l]=i;
if (a[l]*a[l]==n) aux=l-1;
else aux=l;
for (i=aux;i>0;i--) a[++l]=n/a[i];
c[l][l]=1;
for (i=2;i<=l;i++) sum[l][i]=1;
for (i=l-1;i>0;i--)
for (j=l;j>1;j--)
{
sum[i][j]=sum[i][j+1];
if (n%(a[i]*a[j])==0)
{
x=search(a[i]*a[j]);
if (x>j) c[i][j]=sum[x][j];
else c[i][j]=sum[x][x];
sum[i][j]+=c[i][j];
}
}
printf("%d\n",sum[1][2]);
x=1;
while (x<l)
{
for (i=sol[k];i<=l;i++)
if (c[x][i]<m) m-=c[x][i];
else {
sol[++k]=i;
x=search(a[x]*a[i]);
break;
}
}
for (i=1;i<=k;i++) printf("%d ",a[sol[i]]);
printf("\n");
return 0;
}