#include <iostream>
using namespace std;
unsigned long long snoob(unsigned long long x)
{
unsigned long long smallest = x & -x;
unsigned long long ripple = x + smallest;
unsigned long long ones = x ^ ripple;
ones = (ones >> 2)/smallest;
return ripple|ones;
}
template<typename T, size_t N>
void combines( T(&a)[N], size_t K)
{
static_assert( N < 64 );
if (K == 0 || K > N ) return;
unsigned long long x = (1ull << K) - 1;
for(;x < (1ull << N); x = snoob(x))
{
unsigned long long y = x;
for(size_t i = 0; y; y >>= 1, i++)
if (y&1) cout << a[i] << " ";
cout << endl;
}
}
int main(int argc, char * argv[])
{
int a[] = {1,3,5,8,0,7};
combines(a,3);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdW5zaWduZWQgbG9uZyBsb25nIHNub29iKHVuc2lnbmVkIGxvbmcgbG9uZyB4KQp7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgc21hbGxlc3QgPSB4ICYgLXg7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmlwcGxlICAgPSB4ICsgc21hbGxlc3Q7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgb25lcyAgICAgPSB4IF4gcmlwcGxlOwogICAgb25lcyA9IChvbmVzID4+IDIpL3NtYWxsZXN0OwogICAgcmV0dXJuIHJpcHBsZXxvbmVzOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgTj4Kdm9pZCBjb21iaW5lcyggVCgmYSlbTl0sIHNpemVfdCBLKQp7CiAgICBzdGF0aWNfYXNzZXJ0KCBOIDwgNjQgKTsKICAgIGlmIChLID09IDAgfHwgSyA+IE4gKSByZXR1cm47CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgeCA9ICgxdWxsIDw8IEspIC0gMTsKICAgIGZvcig7eCA8ICgxdWxsIDw8IE4pOyB4ID0gc25vb2IoeCkpCiAgICB7CiAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHkgPSB4OwogICAgICAgIGZvcihzaXplX3QgaSA9IDA7IHk7IHkgPj49IDEsIGkrKykKICAgICAgICAgICAgaWYgKHkmMSkgY291dCA8PCBhW2ldIDw8ICIgIjsKICAgICAgICBjb3V0IDw8IGVuZGw7CiAgICB9Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKQp7CiAgICBpbnQgYVtdID0gezEsMyw1LDgsMCw3fTsKICAgIGNvbWJpbmVzKGEsMyk7Cn0K