Pagini recente » Autentificare | Cod sursa (job #1719226) | Cod sursa (job #2283487) | Cod sursa (job #362453) | Cod sursa (job #2405740)
#include <fstream>
#include <algorithm>
#define DIM 3005
using namespace std;
ifstream fin ("desc.in");
ofstream fout ("desc.out");
long long n,d,nr;
unsigned long long dp[DIM][DIM],v[DIM];
int k,i,j,st,dr,mid,dv,poz;
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;
}
}
v[++dv] = n;
sort (v+1,v+dv+1);
v[0] = 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++){
poz = 0;
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;
}*/
while (v[poz] < nr)
poz++;
dp[i][j] += dp[poz][j];
}
}
}
fout<<dp[dv][1]<<"\n";
//if (k > dp[dv][1])
//return 0;
i = dv, j = 1;
while (n){
while (dp[i][j] - dp[i][j+1] < k){
k -= (dp[i][j] - dp[i][j+1]);
j++;
}
fout<<v[j]<<" ";
//n /= v[j];
while (i >= 1 && v[i] > n/v[j])
i--;
n = v[i];
if (i < 1)
break;
}
/*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;
}