1 条题解
-
0
从0-2^B枚举即可,将i和前面存下的所有答案对比,满足条件就存进去,这里我们判不同位的个数可以直接用异或(相同为0不同为1),然后用函数求出异或后'1'的个数即可
#include <map> #include <queue> #include <cmath> #include <cstdio> #include <string> #include <cstring> #include <iostream> #include <algorithm> #define lowbit(a) (a&(-a)) #define _mid(a,b) ((a+b)/2) #define _mem(a,b) memset(a,0,(b+3)<<2) #define fori(a) for(int i=0;i<a;i++) #define forj(a) for(int j=0;j<a;j++) #define ifor(a) for(int i=1;i<=a;i++) #define jfor(a) for(int j=1;j<=a;j++) #define mem(a,b) memset(a,b,sizeof(a)) #define IN freopen("in.txt","r",stdin) #define OUT freopen("out.txt","w",stdout) #define IO do{\ ios::sync_with_stdio(false);\ cin.tie(0);\ cout.tie(0);}while(0) using namespace std; typedef long long ll; const int maxn = 150+10; const int INF = 0x3f3f3f3f; const int inf = 0x3f; const double EPS = 1e-7; const double Pi = acos(-1); const int MOD = 1e9+7; int Minbit; int a[maxn]; int cnt; bool juge(int x){ fori(cnt) if(__builtin_popcount(x^a[i])<Minbit) //编译器内置函数,求出x^a[i]的二进制数中'1'的个数 return false; return true; } int main(){ int n,b; cin >> n >>b >>Minbit; fori(1<<b){ if(juge(i)) a[cnt++] = i; if(cnt == n) break; } int cn = 1; fori(cnt){ cout <<a[i]; if(cn%10==0) cout << endl; else if(i!=cnt-1) cout <<" "; cn++; } return 0; }
- 1
信息
- ID
- 1631
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 48
- 已通过
- 37
- 上传者