Pagini recente » Cod sursa (job #616771) | Cod sursa (job #1816924) | Cod sursa (job #2237495) | Cod sursa (job #686689) | Cod sursa (job #1768577)
#include <fstream>
#include <vector>
#include <algorithm>
#include <map>
#include <cmath>
using namespace std;
uint64_t N, K;
vector<uint64_t> divs;
vector<uint64_t> solution;
map<pair<uint64_t, uint64_t>, uint64_t> possibilitiesMap;
map<pair<uint64_t, uint64_t>, uint64_t>::iterator iter;
uint64_t possibilities(uint64_t lowerLimit, uint64_t number)
{
if (lowerLimit > number)
return 0;
if (lowerLimit == number) {
pair<uint64_t, uint64_t> localPair(lowerLimit, number);
iter = possibilitiesMap.find(localPair);
if (iter == possibilitiesMap.end())
{
possibilitiesMap.insert(pair<pair<uint64_t, uint64_t>, uint64_t>(localPair, 1));
}
return 1;
}
uint64_t contor = 0;
for (uint64_t i = 0; i < divs.size(); i++)
{
if (divs[i] >= lowerLimit && number % divs[i] == 0)
{
contor += possibilities(divs[i], number / divs[i]);
}
}
contor += possibilities(number, number);
pair<uint64_t, uint64_t> localPair(lowerLimit, number);
possibilitiesMap.insert(pair<pair<uint64_t, uint64_t>, uint64_t>(localPair, contor));
return contor;
}
int main()
{
ifstream fin("desc.in");
fin >> N >> K;
fin.close();
for(uint64_t i = 2; i <= sqrt(N); i++) {
if (N % i == 0) {
divs.push_back(i);
if (i != (N / i))
divs.push_back(N / i);
}
}
divs.push_back(N);
sort(divs.begin(), divs.end());
ofstream fout("desc.out");
fout << possibilities(2, N) << "\n";
uint64_t index = 0;
bool solutionFound = 0;
while (!solutionFound && K > 0)
{
//Get next digit;
uint64_t divizor = divs[index];
if (N % divizor != 0)
{
index++;
}
else
{
if (N == divizor)
{
solution.push_back(N);
solutionFound = 1;
}
else {
pair<uint64_t, uint64_t> localPair(divizor, N / divizor);
iter = possibilitiesMap.find(localPair);
uint64_t poss = iter->second;
if (poss < K) {
K -= poss;
index++;
if (K == 0) {
solutionFound = 1;
}
} else {
solution.push_back(divizor);
N /= divizor;
}
}
}
}
for( uint64_t i = 0; i < solution.size(); i++)
{
fout << solution[i] << " ";
}
fout.close();
}