Gosper’s Hack是一个巧妙地利用位运算实现生成n元集合所有k元子集的算法,最近在知乎看到的大佬算法笔记学习到的
详情传送门 https://zhuanlan.zhihu.com/p/360512296
这个算法跑出来100ms左右,位运算把每次转移加速到$O(1)$, 时间复杂度是$O(C_{n}^{m}*n)$
#include<iostream>
using namespace std;
int num[1 << 25];
int main()
{
int n, m, cnt = 0;
cin >> n >> m;
if(m == 0) return 0;
int cur = (1 << m) - 1, limit = (1 << n);
while(cur < limit) {
num[cnt++] = cur;
int lb = cur & -cur;
int t = cur + lb;
cur = (((cur ^ t) >> 2) / lb) | t;
}
for(int i = cnt - 1;i >= 0;i--) {
for(int j = n - 1;j >= 0;j--) {
if((1 << j) & num[i]) cout << n - j << " ";
}
cout << endl;
}
return 0;
}
太强了哥
tql
厉害,比我快了一倍