HDU 4810 Wall Painting 异或性质
2014-10-01 01:20
281 查看
题意:一共有N种颜色,给出每种颜色的值。第i天,我们会取出i种颜色,将其混合,得到的混合颜色的值为这些颜色值的异或。求,对于每一天,所有方案得到的混合颜色的和。
思路:对于异或,我们要利用异或的性质。几个数异或,对应二进制表达中,只有对应为1的才可能会对最后的答案有贡献,是否有贡献,还要看是有奇数个1,还是偶数个1.如果为偶数,那最后就是0。
这样,对于每一位,我们可以枚举所有的奇数个1,计算对应的所有的和。
代码如下:
思路:对于异或,我们要利用异或的性质。几个数异或,对应二进制表达中,只有对应为1的才可能会对最后的答案有贡献,是否有贡献,还要看是有奇数个1,还是偶数个1.如果为偶数,那最后就是0。
这样,对于每一位,我们可以枚举所有的奇数个1,计算对应的所有的和。
代码如下:
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; const int MOD = 1000003; int cnt[35] ; LL C[1002][1002],ans[1002]; int N; void init(){ int i , j; for(i = 0;i <= 1001;i++) C[i][0] = C[i][i] = 1; for(i = 1;i <= 1001;i++) for(j = 1;j < i;j++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j])%MOD; } void change(int x) { for(int i = 0; x; i++){ if(x&1) cnt[i]++; x >>= 1; } } int main() { int x,N; init(); while(scanf("%d",&N) != EOF){ memset(cnt,0,sizeof(cnt)); memset(ans,0,sizeof(ans)); for(int i = 1;i <= N;i++){ scanf("%d",&x); change(x); } for(int i = 1;i <= N;i++){ for(int j = 0;j < 32;j++){ for(int k = 1;k <= i;k += 2) ans[i] += ((C[cnt[j]][k] * C[N - cnt[j]][i - k])%MOD) * ((1<<j)%MOD); ans[i] %= MOD; } } for(int i = 1; i <= N; ++i) printf("%lld%c",ans[i], i == N?'\n':' '); } return 0; }
相关文章推荐
- HDU 4810 Wall Painting(异或 组合数)
- HDU 4810 Wall Painting【二进制+异或+暴力枚举】
- HDU 4810 Wall Painting (位操作-异或)
- HDU 4810 Wall Painting(异或 +按位容斥)
- HDU 4810 Wall Painting(异或数学)
- HDU 4810 Wall Painting(组合数学 + 位运算)——2013ACM/ICPC亚洲区南京站现场赛
- HDU 4810 Wall Painting (2进制+组合数)
- [HDU 4810] Wall Painting 组合数 按位处理
- HDU - 4810 Wall Painting(组合数学)
- HDU - 4810 Wall Painting(组合数学)
- HDU - 4810 Wall Painting(组合数学)
- hdu-4810 Wall Painting(组合数学)
- hdu 4810 Wall Painting
- 【HDU 4810】组合数学 Wall painting
- HDU - 4810 Wall Painting(组合数学)
- hdu 4810 Wall Painting 位操作
- HDU - 4810 Wall Painting(组合数学)
- hdu 4810 Wall Painting
- HDU - 4810 Wall Painting(组合数学)
- HDU 5344 MZL's xor (异或运算的性质)