Pagini recente » Cod sursa (job #3285177) | Cod sursa (job #1785360) | Cod sursa (job #70300) | Cod sursa (job #2121461) | Cod sursa (job #344982)
Cod sursa(job #344982)
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <map>
#define ll long long
#define pb push_back
#define mp make_pair
using namespace std;
ll n, k, rez;
vector <ll> vctDiv;
map <pair <ll, ll>, ll> sol;
inline ll solFct(ll nr, int st)
{
if (nr == 1)
return 1;
if (sol[mp(nr, vctDiv[st])])
return sol[mp(nr, vctDiv[st])];
ll solT = 0;
for (int i = st; i < vctDiv.size(); i++)
if (nr % vctDiv[i] == 0)
solT += solFct(nr / vctDiv[i], i);
sol[mp(nr, vctDiv[st])] = solT;
return solT;
}
inline void afis(ll n, int k, int st)
{
for (int i = st; i < vctDiv.size(); i++)
if (n % vctDiv[i] == 0)
if (sol[mp(n, vctDiv[i])] < k)
k -= sol[mp(n, vctDiv[i])];
else
{
printf("%d ", vctDiv[i]);
afis(n / vctDiv[i], k, i);
break;
}
}
int main()
{
freopen("desc.in", "r", stdin);
freopen("desc.out", "w", stdout);
scanf("%d %d", &n, &k);
vctDiv.pb(n);
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
{
vctDiv.pb(i);
if (i * i != n)
vctDiv.pb(n / i);
}
sort(vctDiv.begin(), vctDiv.end());
for (int i = 0; i < vctDiv.size(); i++)
sol[mp(vctDiv[i], vctDiv[i])] = 1;
for (int i = 0; i < vctDiv.size(); i++)
{
sol[mp(n, vctDiv[i])] = solFct(n / vctDiv[i], i);
rez += sol[mp(n, vctDiv[i])];
}
printf("%d\n", rez);
afis(n, k, 0);
fclose(stdin);
fclose(stdout);
return 0;
}