Pagini recente » Autentificare | Cod sursa (job #989825) | kingoni | Cod sursa (job #2247384) | Cod sursa (job #2471544)
#include <bits/stdc++.h>
using namespace std;
using namespace std::placeholders;
#define llong long long
#define xx first
#define yy second
#define len(x) ((int)x.size())
#define rep(i,n) for (int i = -1; ++ i < n; )
#define rep1(i,n) for (int i = 0; i ++ < n; )
#define all(x) x.begin(), x.end()
// #define rand __rand
// mt19937 rng(chrono::system_clock::now().time_since_epoch().count()); // or mt19937_64
// template<class T = int> T rand(T range = numeric_limits<T>::max()) {
// return (T)(rng() % range);
// }
#define maxdiv 5050
vector<llong> get_divisors(llong num) {
vector<llong> u, v;
for (llong i = 1; i * i <= num; ++i) {
if (num % i) continue;
u.push_back(i);
if (i * i != num)
v.push_back(num / i);
}
u.insert(u.end(), v.rbegin(), v.rend());
return u;
}
int div_res[maxdiv][maxdiv];
llong dp[maxdiv][maxdiv];
int main(void) {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
llong n, k;
cin >> n >> k;
auto divisors = get_divisors(n);
memset(div_res, -1, sizeof(div_res));
memset(dp, 0, sizeof(dp));
// for (auto u: divisors) clog << u << ' ';
// clog << endl;
rep(i, len(divisors)) {
int v = i;
rep(u, i + 1) {
if (divisors[i] % divisors[u]) continue;
while (v >= 0 and divisors[i] != divisors[u] * divisors[v]) --v;
if (u > v) break;
// clog << i << ' ' << u << ' ' <<v << endl;
div_res[i][u] = v;
div_res[i][v] = u;
}
}
// clog << endl;
rep1(base, len(divisors) - 1) {
dp[base][base] = 1;
for (int start = base; start--; ) {
dp[base][start] = dp[base][start + 1];
if (div_res[base][start] == -1) continue;
dp[base][start] += dp[div_res[base][start]][start];
}
// rep(f, base + 1) clog << base << ' ' << f << ' ' << dp[base][f] << endl;
}
cout << dp[len(divisors) - 1][1] << '\n';
// clog << endl;
int prev = 1;
for (int num = len(divisors) - 1; num > 0; ) {
for (int i = prev; i < len(divisors); ++i) {
if (div_res[num][i] == -1) continue;
llong cnt = dp[num][i] - dp[num][i + 1];
// clog << cnt << endl;
if (k > cnt) k -= cnt;
else {
// clog << divisors[i] << ' ' << i << ' ' << num << endl;
cout << divisors[i] << ' ';
num = div_res[num][i];
prev = i;
break;
}
}
}
return 0;
}