Pagini recente » Cod sursa (job #1926205) | Cod sursa (job #1658374) | Cod sursa (job #1744400) | Cod sursa (job #277405) | Cod sursa (job #2405682)
#include <fstream>
#include <algorithm>
#define DIM 3005
using namespace std;
ifstream fin ("desc.in");
ofstream fout ("desc.out");
long long n,d,nr;
long long dp[DIM][DIM],v[DIM];
int k,i,j,st,dr,mid,dv;
int main (){
fin>>n>>k;
if (n == 1){
fout<<"1\n1";
return 0;
}
for (d=2;d<=n/d;d++){
if (n%d == 0){
v[++dv] = d;
if (n/d != d)
v[++dv] = n/d;
}
}
if (n > 1)
v[++dv] = n;
sort (v+1,v+dv+1);
for (i=1;i<=dv;i++)
dp[0][i] = 1;
/// d[i][j] - in cate moduri pot obtine divizorul v[i] folosind doar divizorii j,..,dv
for (i=1;i<=dv;i++){
for (j=i;j;j--){
dp[i][j] = dp[i][j+1];
if (i == j)
dp[i][j] = 1;
if (v[i] % v[j] == 0){
nr = v[i]/v[j];
st = 1, dr = dv;
while (st <= dr){
mid = (st+dr)/2;
if (v[mid] == nr)
break;
if (v[mid] < nr)
st = mid+1;
else dr = mid-1;
}
dp[i][j] += dp[mid][j];
}
}
}
fout<<dp[dv][1]<<"\n";
if (k > dp[dv][1])
return 0;
i = 1;
for (;;){
for (;i<=dv;i++){
if (n%v[i] != 0)
continue;
nr = n/v[i];
st = 0, dr = dv;
while (st <= dr){
mid = (st+dr)/2;
if (v[mid] == nr)
break;
if (v[mid] < nr)
st = mid+1;
else dr = mid-1;
}
if (dp[mid][i] < k)
k -= dp[mid][i];
else {
fout<<v[i]<<" ";
n /= v[i];
break;
}
}
if (n == 1)
break;
}
return 0;
}