Pagini recente » Cod sursa (job #1483108) | Cod sursa (job #2358320) | Cod sursa (job #1887227) | Cod sursa (job #2989328) | Cod sursa (job #2396536)
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
unsigned long long di [1001],dp[1001][1001];
unsigned long long elem=0;
unsigned long long find_poz (unsigned long long x){
unsigned 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");
unsigned long long k,i,j,last;
unsigned long long n,d,sum,x;
fscanf (fin,"%llu",&n);
fscanf (fin,"%llu",&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,"%llu\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,"%llu ",n);
return 0;
}
sum=sum+(dp[find_poz(n/di[i])][i]);
}
if (sum>=k){
fprintf (fout,"%llu ",di[i]);
last=i;
k=k-(sum-dp[find_poz(n/di[i])][i]);
sum=0;
n/=di[i];
break;
}
}
}
return 0;
}