#include <iostream>
#include <string>
#include <cstdio>
#include <cctype>
#include <ctime>
#include <random>
#include <iterator>
#include <algorithm>
const int combs3[] = {
1,3, 5,1,3, 6,1,3, 7,1,3, 8,1,3, 9,1,3,10,1,4, 6,1,4, 7,
1,4, 8,1,4, 9,1,4,10,1,5, 7,1,5, 8,1,5, 9,1,5,10,1,6, 8,
1,6, 9,1,6,10,1,7, 9,1,7,10,1,8,10,2,4, 6,2,4, 7,2,4, 8,
2,4, 9,2,4,10,2,5, 7,2,5, 8,2,5, 9,2,5,10,2,6, 8,2,6, 9,
2,6,10,2,7, 9,2,7,10,2,8,10,3,5, 7,3,5, 8,3,5, 9,3,5,10,
3,6, 8,3,6, 9,3,6,10,3,7, 9,3,7,10,3,8,10,4,6, 8,4,6, 9,
4,6,10,4,7, 9,4,7,10,4,8,10,5,7, 9,5,7,10,5,8,10,6,8,10
};
std::vector<int> generate_random(const int n, const int m, const int k)
{
if ((n < m) || ((n / m) < k))
{
return std::vector<int>();
}
std::random_device source;
std::mt19937 generator(source());
std::uniform_int_distribution<> distribution(1, n - (m - 1) * k);
std::vector<int> result_list;
result_list.reserve(m);
for (int i = 0; i < m; ++i)
{
result_list.push_back(distribution(generator));
}
std::sort(std::begin(result_list),std::end(result_list));
for (int i = 0; i < m; ++i)
{
result_list[i] += (i * k);
}
return result_list;
}
int main()
{
typedef std::vector<int> v_t;
std::vector<std::pair<v_t,std::size_t>> comb_list;
int i = 0;
while (i < sizeof(combs3) / sizeof(int))
{
comb_list.push_back(std::make_pair(v_t(combs3 + i,combs3 + i + 3),0));
i += 3;
}
for (std::size_t i = 0; i < comb_list.size(); ++i)
{
printf("%02d\t",i);
std::copy(std::begin(comb_list[i].first),
std::end(comb_list[i].first),
std::ostream_iterator<int>(std::cout," "));
std::cout << std::endl;
}
const int rounds = 1000;
for (int r = 0; r < rounds; ++r)
{
const int n = 10;
const int m = 3;
const int k = 2;
std::vector<int> comb_index_list = generate_random(n,m,k);
bool found = false;
for (std::size_t i = 0; i < comb_list.size(); ++i)
{
if (std::equal(std::begin(comb_index_list),std::end(comb_index_list),std::begin(comb_list[i].first)))
{
comb_list[i].second++;
found = true;
break;
}
}
if (!found)
{
std::cout << "Error: combination not found: ";
std::copy(std::begin(comb_index_list),
std::end(comb_index_list),
std::ostream_iterator<int>(std::cout," "));
break;
}
}
for (std::size_t i = 0; i < comb_list.size(); ++i)
{
printf("comb[%02d] %10.6f\n",i,((1.0 * comb_list[i].second) / rounds));
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y2N0eXBlPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCmNvbnN0IGludCBjb21iczNbXSA9IHsKICAgICAgICAgICAgICAgICAgICAgIDEsMywgNSwxLDMsIDYsMSwzLCA3LDEsMywgOCwxLDMsIDksMSwzLDEwLDEsNCwgNiwxLDQsIDcsCiAgICAgICAgICAgICAgICAgICAgICAxLDQsIDgsMSw0LCA5LDEsNCwxMCwxLDUsIDcsMSw1LCA4LDEsNSwgOSwxLDUsMTAsMSw2LCA4LAogICAgICAgICAgICAgICAgICAgICAgMSw2LCA5LDEsNiwxMCwxLDcsIDksMSw3LDEwLDEsOCwxMCwyLDQsIDYsMiw0LCA3LDIsNCwgOCwKICAgICAgICAgICAgICAgICAgICAgIDIsNCwgOSwyLDQsMTAsMiw1LCA3LDIsNSwgOCwyLDUsIDksMiw1LDEwLDIsNiwgOCwyLDYsIDksCiAgICAgICAgICAgICAgICAgICAgICAyLDYsMTAsMiw3LCA5LDIsNywxMCwyLDgsMTAsMyw1LCA3LDMsNSwgOCwzLDUsIDksMyw1LDEwLAogICAgICAgICAgICAgICAgICAgICAgMyw2LCA4LDMsNiwgOSwzLDYsMTAsMyw3LCA5LDMsNywxMCwzLDgsMTAsNCw2LCA4LDQsNiwgOSwKICAgICAgICAgICAgICAgICAgICAgIDQsNiwxMCw0LDcsIDksNCw3LDEwLDQsOCwxMCw1LDcsIDksNSw3LDEwLDUsOCwxMCw2LDgsMTAKICAgICAgICAgICAgICAgICAgICAgfTsKCgpzdGQ6OnZlY3RvcjxpbnQ+IGdlbmVyYXRlX3JhbmRvbShjb25zdCBpbnQgbiwgY29uc3QgaW50IG0sIGNvbnN0IGludCBrKQp7CiAgIGlmICgobiA8IG0pIHx8ICgobiAvIG0pIDwgaykpCiAgIHsKICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPGludD4oKTsKICAgfQoKICAgc3RkOjpyYW5kb21fZGV2aWNlIHNvdXJjZTsKICAgc3RkOjptdDE5OTM3IGdlbmVyYXRvcihzb3VyY2UoKSk7CiAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4gZGlzdHJpYnV0aW9uKDEsIG4gLSAobSAtIDEpICogayk7CgogICBzdGQ6OnZlY3RvcjxpbnQ+IHJlc3VsdF9saXN0OwogICByZXN1bHRfbGlzdC5yZXNlcnZlKG0pOwoKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyArK2kpCiAgIHsKICAgICAgcmVzdWx0X2xpc3QucHVzaF9iYWNrKGRpc3RyaWJ1dGlvbihnZW5lcmF0b3IpKTsKICAgfQoKICAgc3RkOjpzb3J0KHN0ZDo6YmVnaW4ocmVzdWx0X2xpc3QpLHN0ZDo6ZW5kKHJlc3VsdF9saXN0KSk7CgogICBmb3IgKGludCBpID0gMDsgaSA8IG07ICsraSkKICAgewogICAgICByZXN1bHRfbGlzdFtpXSArPSAoaSAqIGspOwogICB9CgogICByZXR1cm4gcmVzdWx0X2xpc3Q7Cn0KCmludCBtYWluKCkKewogICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD4gdl90OwoKICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHZfdCxzdGQ6OnNpemVfdD4+IGNvbWJfbGlzdDsKCiAgIGludCBpID0gMDsKCiAgIHdoaWxlIChpIDwgc2l6ZW9mKGNvbWJzMykgLyBzaXplb2YoaW50KSkKICAgewogICAgICBjb21iX2xpc3QucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKHZfdChjb21iczMgKyBpLGNvbWJzMyArIGkgKyAzKSwwKSk7CiAgICAgIGkgKz0gMzsKICAgfQoKICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGNvbWJfbGlzdC5zaXplKCk7ICsraSkKICAgewogICAgICBwcmludGYoIiUwMmRcdCIsaSk7CiAgICAgIHN0ZDo6Y29weShzdGQ6OmJlZ2luKGNvbWJfbGlzdFtpXS5maXJzdCksCiAgICAgICAgICAgICAgICBzdGQ6OmVuZChjb21iX2xpc3RbaV0uZmlyc3QpLAogICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPGludD4oc3RkOjpjb3V0LCIgIikpOwogICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICB9CgogICBjb25zdCBpbnQgcm91bmRzID0gMTAwMDsKCiAgIGZvciAoaW50IHIgPSAwOyByIDwgcm91bmRzOyArK3IpCiAgIHsKICAgICAgY29uc3QgaW50IG4gPSAxMDsKICAgICAgY29uc3QgaW50IG0gPSAzOwogICAgICBjb25zdCBpbnQgayA9IDI7CiAgICAgIHN0ZDo6dmVjdG9yPGludD4gY29tYl9pbmRleF9saXN0ID0gZ2VuZXJhdGVfcmFuZG9tKG4sbSxrKTsKCiAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGNvbWJfbGlzdC5zaXplKCk7ICsraSkKICAgICAgewogICAgICAgICBpZiAoc3RkOjplcXVhbChzdGQ6OmJlZ2luKGNvbWJfaW5kZXhfbGlzdCksc3RkOjplbmQoY29tYl9pbmRleF9saXN0KSxzdGQ6OmJlZ2luKGNvbWJfbGlzdFtpXS5maXJzdCkpKQogICAgICAgICB7CiAgICAgICAgICAgIGNvbWJfbGlzdFtpXS5zZWNvbmQrKzsKICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoIWZvdW5kKQogICAgICB7CiAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IGNvbWJpbmF0aW9uIG5vdCBmb3VuZDogIjsKICAgICAgICAgc3RkOjpjb3B5KHN0ZDo6YmVnaW4oY29tYl9pbmRleF9saXN0KSwKICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKGNvbWJfaW5kZXhfbGlzdCksCiAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8aW50PihzdGQ6OmNvdXQsIiAiKSk7CiAgICAgICAgIGJyZWFrOwogICAgICB9CiAgIH0KCiAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBjb21iX2xpc3Quc2l6ZSgpOyArK2kpCiAgIHsKICAgICAgcHJpbnRmKCJjb21iWyUwMmRdICAlMTAuNmZcbiIsaSwoKDEuMCAqIGNvbWJfbGlzdFtpXS5zZWNvbmQpIC8gcm91bmRzKSk7CiAgIH0KCiAgIHJldHVybiAwOwp9Cg==