位运算
集合枚举
for(int i=0;i<1<<n;i++){ for(int j=i;;i=(j+1)|i){ if(j==(i<<n)-1) break; } }
6
3 5 6 2 5 3
=>2 6
#include<bits/stdc++.h> using namespace std; int n, a[1000001]; int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> n; for (int i = 1; i <= n; i++){ cin >> a[i]; } int v = 0; for (int i = 1; i <= n; i++)v ^= a[i]; int c = 0; for (; v; v >>= 1)++c; int x = 0, y = 0; for (int i=0;i<=n;i++) if ((a[i] >> (c - 1)) & 1) y ^= a[i]; else x ^= a[i]; cout << x <<" "<< y << "\n"; return 0; }
j&i=j =>说明j是i 的子集
2
=>1 1 2 12
#include<bits/stdc++.h> using namespace std; const int p = 1000000007; int n, f[100001]; int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> n; f[0] = 1; for (int i = 1; i < 1 << n; i++){ f[i] = 1; for (int j = (i - 1)&i; j; j = (j - 1)&i) f[i] += f[j] ,f[i]%p; f[i] = 1LL * f[i] * i%p; } for (int i = 0; i < 1 << n; i++) cout << f[i]<<" "; return 0; }
3
=>
000
001 010 100
011 101 110
111
#include<bits/stdc++.h> using namespace std; const int p = 1000000007; int n, f[100001],c[31]; int nex(int x){ int t = (x | (x - 1)) + 1; return t | (((t&-t) / (x&(-x)) >> 1) - 1); } int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> n; for (int i = 1; i <= n; i++)cout << "0"; cout<< "\n"; for (int i = 1; i <= n; i++){ int j = (1 << i) - 1; for (; j < 1 << n; j = nex(j)){ for (int k = 1, l = j; k <= n; k++, l /= 2) c[k] = l & 1; for (int k = n; k; --k) cout << c[k]; cout<< " "; } cout << "\n"; } return 0; }
#include<bits/stdc++.h> using namespace std; int n, m,v[1001]; long long f[10][101][65]; bool b[1001]; int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> n>>m; for (int i = 0; i < 1 << n; i++){ v[i] = 0; for (int j = i; j; j = j&(j - 1)) v[i]++; b[i] = ((i&(i << 1)) == 0); } memset(f, 0, sizeof(f)); f[0][0][0] = 1; for (int i=1;i<=n;i++) for (int j=0;j<1<<n;j++) for (int k=0;k<=n*n;k++) if (f[i-1][j][k]) for (int l=0;l<1<<n;l++) if (((l&j) == 0) && (((l << 1)&j) == 0) && (((l >> 1)&j) == 0) && b[l]) f[i][l][k + v[l]] += f[i - 1][j][k]; long long ans = 0; for (int i = 0; i < 1 << n; i++) ans += f[n][i][m]; cout << ans << "\n"; return 0; }