Pagini recente » Cod sursa (job #1613761) | Cod sursa (job #2474662) | Cod sursa (job #2638157) | Cod sursa (job #1254442) | Cod sursa (job #1691227)
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <vector>
#define NrDivMax 4096
using namespace std;
long long N;
int K;
int dp[NrDivMax][NrDivMax];
int nrdiv;
long long v[NrDivMax];
vector <int> sol;
void Read()
{
ifstream f ("desc.in");
f>>N>>K;
f.close();
}
void Desc()
{
long long d;
v[++nrdiv] = N;
for (d = 2; d*d <= N; ++d)
{
if (N%d)
continue;
v[++nrdiv] = d;
if (d*d < N)
v[++nrdiv] = N/d;
}
sort(v+1, v+nrdiv+1);
}
inline int CautareBinara(const long long x)
{
int st = 1, dr = nrdiv, mij;
while (st <= dr)
{
mij = (st+dr)>>1;
if (v[mij] == x)
return mij;
if (v[mij] < x)
st = mij + 1;
else
dr = mij - 1;
}
return 0;
}
void Solve()
{
Desc();
cout<<"da";
int i, j;
for (i=1; i<=nrdiv; ++i)
dp[i][i] = 1;
for (i=2; i<=nrdiv; ++i)
{
for (j=i-1; j; --j)
{
dp[i][j] += dp[i][j+1];
if (v[i] % v[j] == 0)
{
long long aux = v[i]/v[j];
int poz = CautareBinara(aux);
dp[i][j] += dp[poz][j];
}
}
}
while (K!=0)
{
int poz = CautareBinara(N);
int sum = 0;
int start = 1;
if (!sol.empty())
start = CautareBinara(sol.back());
for (i=start; i<=poz; ++i)
{
int localsum = dp[poz][i] - dp[poz][i+1];
sum = sum + localsum;
if (sum >= K)
{
sum = sum - localsum;
K -= sum;
if (dp[poz][start] == 1)
--K;
N = N / v[i];
sol.push_back(v[i]);
i = poz+1;
}
}
}
}
void Write()
{
ofstream g("desc.out");
g<<dp[nrdiv][1]<<"\n";
for (vector <int>::iterator it = sol.begin(); it != sol.end(); ++it)
g<<*it<<" ";
g<<"\n";
g.close();
}
int main()
{
Read();
Solve();
Write();
return 0;
}