Pagini recente » Cod sursa (job #2110370) | Cod sursa (job #2770746) | Cod sursa (job #2906932) | Cod sursa (job #151922) | Cod sursa (job #2396546)
#include <cstdio>
#include <algorithm>
using namespace std;
long long di [7001],dp[2501][2501];
long long elem=0;
long long find_poz (long long x){
long long st,dr,mid;
st=1;
dr=elem;
while (st<=dr){
mid=(st+dr)/2;
if (di[mid]==x)
return mid;
else if (di[mid]<x)
st=mid+1;
else dr=mid-1;
}
return 0;
}
int main()
{
FILE *fin=fopen ("desc.in","r");
FILE *fout=fopen ("desc.out","w");
long long k,i,j,last;
long long n,d,sum,x;
fscanf (fin,"%lld",&n);
fscanf (fin,"%lld",&k);
d=1;
while (d*d<=n){
if (n%d==0){
di[++elem]=d;
if (d!=n/d)
di[++elem]=n/d;
}
d++;
}
/// maxim 2 * 10 ^ 6 divizori
sort (di+1,di+elem+1);
/// dp[i][j] = folosind divizori de la j..elem sa ai produsul i
dp[1][1]=1;
for (i=1;i<=elem;i++){
dp[i][i]=1;
for (j=i-1;j>=2;j--){
if (di[i]%di[j]==0) /// adaugi un di[j] la di[i]/di[j]
dp[i][j]+=dp[find_poz(di[i]/di[j])][j];
}
for (j=elem-1;j;j--)
dp[i][j]+=dp[i][j+1];
}
fprintf (fout,"%lld\n",dp[elem][1]);
sum=0;
last=2;
while (n!=1){
for (i=last;i<=elem;i++){
if (n%di[i]==0){
if (n==di[i]){
fprintf (fout,"%lld ",n);
return 0;
}
sum=sum+(dp[find_poz(n/di[i])][i]);
}
if (sum>=k){
fprintf (fout,"%lld ",di[i]);
last=i;
k=k-(sum-dp[find_poz(n/di[i])][i]);
sum=0;
n/=di[i];
break;
}
}
}
return 0;
}