Pagini recente » Cod sursa (job #2360453) | Cod sursa (job #2041960) | Cod sursa (job #278763) | Cod sursa (job #3209452) | Cod sursa (job #36532)
Cod sursa(job #36532)
# include <stdio.h>
# define _fin "desc.in"
# define _fout "desc.out"
# define maxd 3001
# define myint long long
myint dvz[maxd], n, k, nd;
myint sol[maxd], la[maxd], lb[maxd];
int a[maxd][maxd];
void presolve()
{
myint d, i;
for (d=2; n/d>d; d++)
if ( !(n%d) ) la[++la[0]]=d, lb[++lb[0]]=n/d;
for (i=1; i<=la[0]; i++) dvz[++nd] = la[i];
if ( d*d==n ) dvz[++nd]=d;
for (i=lb[0]; i>=1; i--) dvz[++nd] = lb[i];
dvz[0]=1, dvz[++nd]=n;
}
myint poz(myint x)
{
myint i, step;
for (step=1; step<=nd; step<<=1); step>>=1;
for (i=0; step; step>>=1)
if ( i+step <= nd )
if ( dvz[i+step]<=x ) i+=step;
return i;
}
void solve()
{
myint i, j, aux, x;
for (i=0; i<=nd; i++) a[0][i]=1;
for (i=1; i<=nd; i++)
for (j=nd; j>=1; j--) {
a[i][j] = a[i][j+1];
if ( !( dvz[i]%dvz[j] ) )
a[i][j] += a[poz(dvz[i]/dvz[j])][j];
}
for (x=n, i=1; x!=1; )
{
for (; i<=nd; i++)
if ( !(x%dvz[i]) ) {
aux = a[ poz(x/dvz[i]) ][i];
if ( aux < k )
k-=aux;
else {
sol[++sol[0]] = dvz[i], x/=dvz[i];
break;
}
}
}
}
int main()
{
freopen(_fin, "r", stdin);
freopen(_fout,"w", stdout);
scanf("%lld%lld", &n, &k);
presolve();
solve();
printf("%lld\n", a[nd][1]);
int i;
for (i=1; i<sol[0]; i++) printf("%d ", sol[i]); printf("%d\n", sol[i]);
return 0;
}