Pagini recente » Cod sursa (job #1288506) | Cod sursa (job #2703848) | Cod sursa (job #513035) | Cod sursa (job #1573174) | Cod sursa (job #2478129)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
int k;
int dp[4000][4000];
map<ll, int> ord;
vector<ll> dd;
void get(void)
{
for (int i = 1; 1ll*i*i <= n; i++)
{
if (n%i) continue;
dd.push_back(i);
if (n/i != i) dd.push_back(n/i);
}
sort(dd.begin(), dd.end());
for (int i = 0; i < dd.size(); i++)
ord[dd[i]] = i;
}
int solve(int a, int b)
{
if (a == dd.size() && b != 0) return 0;
if (b == 0) return 1;
if (dp[a][b] != -1) return dp[a][b];
int ans = solve(a+1, b);
if (dd[b]%dd[a] == 0)
ans += solve(a, ord[dd[b]/dd[a]]);
return dp[a][b] = ans;
}
int main(void)
{
freopen("desc.in", "r", stdin);
freopen("desc.out", "w", stdout);
scanf("%lld %d", &n, &k);
get();
memset(dp, -1, sizeof dp);
printf("%d\n", solve(1, dd.size()-1));
ll prod = 1;
int ant = 1;
vector<ll> ans;
while (prod != n)
{
for (int i = ant; i < dd.size(); i++)
{
if (prod*dd[i] > n || (n%(prod*dd[i]) != 0)) continue;
int x = solve(i, ord[n/(prod*dd[i])]);
if (x >= k)
{
ans.push_back(dd[i]);
prod *= dd[i];
ant = i;
break;
}
else k -= x;
}
}
printf("%lld", ans[0]);
for (int i = 1; i < ans.size(); i++)
printf(" %lld", ans[i]);
printf("\n");
}