Pagini recente » Cod sursa (job #702055) | Cod sursa (job #2263616) | Cod sursa (job #529534) | Cod sursa (job #43963) | Cod sursa (job #2628956)
#include <bits/stdc++.h>
std::ifstream fin ("desc.in");
std::ofstream fout ("desc.out");
std::vector <long long> d;
long long binarySearch (long long *arr, long long left, long long right, long long val){
long long mid, sol;
while (left <= right){
mid = (left + right) / 2;
if (arr[mid] >= val){
sol = mid;
left = mid + 1;
}
else
right = mid - 1;
}
return sol;
}
int main()
{
long long n, k, i, j, divisor;
fin >> n >> k;
for (i=1; i*i<=n; i++){
if (n % i == 0){
d.push_back (i);
if (n / i != i)
d.push_back (n/i);
}
}
std::sort (d.begin(), d.end());
/*
for (i=0; i<d.size(); i++)
fout << d[i] << ' ';
*/
long long dp[d.size()+2][d.size()+2];
long long last;
memset (dp, 0, sizeof dp);
for (i=0; i<d.size(); i++)
dp[0][i] = 1;
for (i=1; i<d.size(); i++){
last = 0;
for (j=d.size()-1; j>=0; j--){
divisor = d[i];
dp[i][j] = dp[i][j+1];
if (divisor % d[j] == 0){
divisor /= d[j];
while (d[last] < divisor)
last ++;
dp[i][j] += dp[last][j];
}
}
}
/*
for (i=0; i<d.size(); i++, fout << '\n'){
fout << d[i] << " - ";
for (j=0; j<d.size(); j++)
fout << dp[i][j] << ' ';
}
*/
fout << dp[d.size()-1][1] << '\n';
std::map <long long, long long> mp;
for (i=0; i<d.size(); i++)
mp[d[i]] = i;
i = 1;
long long crt = n;
while (crt > 1){
divisor = d[i];
if (crt%divisor == 0 and dp[mp[crt/divisor]][i] >= k){
fout << divisor << ' ';
crt /= divisor;
}
else if (crt%divisor == 0){
k -= dp[mp[crt/divisor]][i];
i ++;
}
else i++;
}
return 0;
}