#include <algorithm>
#include <iostream>
#include <vector>
#include <tuple>
int cntDiv(int n) //get number of divisors
{
int lim = n;
int c = 0;
if(n == 1)
return 1;
for(int i = 1; i < lim; i++)
{
if(n % i == 0)
{
lim = n / i;
if(lim != i)
c++;
c++;
}
}
return c;
}
std::vector<std::pair<int, int>> customSort(const std::vector<int>& v)
{
std::vector<std::pair<int, int>> ps;
ps.reserve(v.size());
// We don't have zip sort :/
// So building the pair
for (auto e : v)
{
ps.emplace_back(e, cntDiv(e));
}
std::sort(ps.begin(), ps.end(), [](const auto&lhs, const auto& rhs) {
// descending number of divisors, increasing value
return std::make_tuple(-lhs.second, lhs.first)
< std::make_tuple(-rhs.second, rhs.first);
});
return ps;
}
int main()
{
const std::vector<int> v = {12, 20, 4, 100, 13};
const auto res = customSort(v);
for(const auto& p : res)
{
std::cout << p.first << " ";
}
std::cout << std::endl;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dHVwbGU+CgppbnQgY250RGl2KGludCBuKSAgIC8vZ2V0IG51bWJlciBvZiBkaXZpc29ycwp7CiAgICBpbnQgbGltID0gbjsKICAgIGludCBjID0gMDsKICAgIGlmKG4gPT0gMSkKICAgICAgICByZXR1cm4gMTsKICAgIGZvcihpbnQgaSA9IDE7IGkgPCBsaW07IGkrKykKICAgIHsKICAgICAgICBpZihuICUgaSA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgbGltID0gbiAvIGk7CiAgICAgICAgICAgIGlmKGxpbSAhPSBpKQogICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICBjKys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGM7Cn0KCnN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIGludD4+IGN1c3RvbVNvcnQoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgdikKewogICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgaW50Pj4gcHM7CiAgICBwcy5yZXNlcnZlKHYuc2l6ZSgpKTsKICAgIAogICAgLy8gV2UgZG9uJ3QgaGF2ZSB6aXAgc29ydCA6LwogICAgLy8gU28gYnVpbGRpbmcgdGhlIHBhaXIKICAgIGZvciAoYXV0byBlIDogdikKICAgIHsKICAgICAgICBwcy5lbXBsYWNlX2JhY2soZSwgY250RGl2KGUpKTsgCiAgICB9CiAgICBzdGQ6OnNvcnQocHMuYmVnaW4oKSwgcHMuZW5kKCksIFtdKGNvbnN0IGF1dG8mbGhzLCBjb25zdCBhdXRvJiByaHMpIHsKICAgICAgICAvLyBkZXNjZW5kaW5nIG51bWJlciBvZiBkaXZpc29ycywgaW5jcmVhc2luZyB2YWx1ZQogICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUoLWxocy5zZWNvbmQsIGxocy5maXJzdCkKICAgICAgICAgICAgIDwgc3RkOjptYWtlX3R1cGxlKC1yaHMuc2Vjb25kLCByaHMuZmlyc3QpOwogICAgfSk7CiAgICByZXR1cm4gcHM7Cn0KCmludCBtYWluKCkKewogICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiB2ID0gezEyLCAyMCwgNCwgMTAwLCAxM307CiAgICBjb25zdCBhdXRvIHJlcyA9IGN1c3RvbVNvcnQodik7CiAgICAKICAgIGZvcihjb25zdCBhdXRvJiBwIDogcmVzKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCBwLmZpcnN0IDw8ICIgIjsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0=