题意:

从给出的颜料中选出天数个,第一天选一个,第二天选二个...

例如:第二天从4个中选出两个,把这两个进行异或运算(xor)计入结果

对于每一天输出所有异或的和

$\sum_{i=1}nC_{n}{i}$

思路:

0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)

例如样例

4

1 2 10 1

这4个数的二进制表示分别为:

0 0 0 1

0 0 1 0

1 0 1 0

0 0 0 1

第一天: 分别选出 1, 2, 10 ,1 = 14

第二天: 从4个中选出2个进行异或运算,如果选出的是两个1,那么异或是没有意义的,因为 1⊕1=0

转换为2进制进行计算,对于每一列选出奇数个1,这样可以保证异或有意义,所以我们只需要记录每一位有多少个1

从4个中选出2个来做异或,第4位上只有1个1,所以有3种选法可以使得这一位异或之后结果为1,(也就是$C_{3}^{1}$ * $C_{1}^{1}$),第3位的没有1,所以异或结果一定为0,第2位上又2个1,所以有4种选法,同理第一位上也是4种。

具体看代码中解释

代码:

#include<iostream>
#include <cstring>
#include <cmath> using namespace std; typedef long long LL;
const int maxn = 1000 + 10;
const int mod = 1e6 + 3;
LL c[maxn][maxn];
LL a[100]; LL pow_num(int a, int n) {//快速幂
if (a == 0) return 0;
int ans = 1;
while (n) {
if (n & 1) ans *= a;
n >>= 1;
a *= a;
}
return ans;
} void deal(LL x) {
int i = 0;
while (x) {
if (x & 1)
a[i]++;
i++;
x >>= 1;
}
} void init() {
for (int i = 0; i < maxn; i++)
c[i][0] = c[i][i] = 1;
for (int i = 2; i < maxn; i++)
for (int j = 1; j < i; j++)
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
} int main() {
int t;
init();//组合数打表
while (~scanf("%d", &t)) {
memset(a, 0, sizeof(a));
for (int i = 1; i <= t; i++) {
LL x;
scanf("%lld", &x);
deal(x);//储存每一位二进制中1的数量
}
for (int i = 1; i <= t; i++) {//枚举每一天
LL sum = 0;
for (int j = 0; j < 32; j++) {//枚举二进制每一位
LL ans = 0;
for (int l = 1; l <= i; l += 2)//选出奇数个1,每次自增2
ans = (ans + c[a[j]][l] * c[t - a[j]][i - l] % mod) % mod;
//这里是从a[j]个1中选出l个 × 从a[j]个0中选出i-l个
sum = (sum + ans * pow_num(2, j)) % mod;
//乘上每一位对应的10进制大小,所有的加起来就是这一天所求的
}
if (i != t)
printf("%lld ", sum);
else printf("%lld\n", sum);
}
}
return 0;
}

HDU - 4810 - Wall Painting (位运算 + 数学)的更多相关文章

  1. HDU 4810 Wall Painting

    Wall Painting Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. hdu 4810 Wall Painting (组合数+分类数位统计)

    Wall Painting Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  3. hdu 4810 Wall Painting (组合数学+二进制)

    题目链接 下午比赛的时候没有想出来,其实就是int型的数分为30个位,然后按照位来排列枚举. 题意:求n个数里面,取i个数异或的所有组合的和,i取1~n 分析: 将n个数拆成30位2进制,由于每个二进 ...

  4. hdu 1882 Strange Billboard(位运算+枚举)

    http://acm.hdu.edu.cn/showproblem.php?pid=1882 感觉非常不错的一道题. 给一个n*m(1<=n,m<=16)的矩阵,每一个格子都有黑白两面,当 ...

  5. hdu 5023 线段树+位运算

    主要考线段树的区间修改和区间查询,这里有一个问题就是这么把一个区间的多种颜色上传给父亲甚至祖先节点,在这里题目告诉我们最多30颜色,那么我们可以把这30中颜色用二进制储存和传给祖先节点,二进制的每一位 ...

  6. SPOJ:OR(位运算&数学期望)

    Given an array of N integers A1, A2, A3…AN. If you randomly choose two indexes i ,j such that 1 ≤ i ...

  7. HDU 1882 Strange Billboard(位运算)

    题目链接 题意 : 给你一个矩阵,有黑有白,翻转一个块可以让上下左右都翻转过来,问最少翻转多少次能让矩阵变为全白. 思路 : 我们从第一行开始枚举要翻转的状态,最多可以枚举到2的16次方,因为你只要第 ...

  8. HDU 5491 The Next(位运算)

    题意:已知D(0<=D<2^31).s1.s2,其中L为D转化为二进制数时1的个数,题目保证s1<=L<=s2,求一个数,满足以下条件: 1.比D大 2.转化为二进制时1的个数 ...

  9. [HDU] 3711 Binary Number [位运算]

    Binary Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

随机推荐

  1. Nginx入门详解文档

    1 文章内容 掌握nginx+tomcat反向代理的使用方法. 掌握nginx作为负载均衡器的使用方法. 掌握nginx实现web缓存方法. 2 nginx介绍 2.1 什么是nginx Nginx是 ...

  2. APDU命令的结构和处理【转】

    本文转载自:http://blog.csdn.net/yonghenzhita/article/details/36402525 版权声明:本文为博主原创文章,未经博主允许不得转载. 简单说,IFD( ...

  3. PL/SQL -->隐式游标(SQL%FOUND)

    PL/SQL -->隐式游标(SQL%FOUND) 分类: SQL/PLSQL 基础2010-12-22 16:23 4084人阅读 评论(0) 收藏 举报 sqlexceptionoracle ...

  4. ASP.NET Core开发Docker部署

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  5. BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心

    BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心 Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏 ...

  6. 【POJ 1364】 King

    [题目链接] 点击打开链接 [算法] 差分约束系统 [代码] #include <algorithm> #include <bitset> #include <cctyp ...

  7. 19_传智播客iOS视频教程_类和对象

    什么是类?什么是对象? 看的见.摸的着.拿过来就可以直接使用.例如报纸就是一个对象. 学生这个东西可不可以只是指一个?就只有那一个才是学生.不是的,学生是有很多个的.它是对一类人的统称.类是统称.所以 ...

  8. eclipse maven创建web项目

    记录地址 jdk设置及文件包miss 实例下载地址 创建SSM整合项目 一.使用Eclipse中的maven插件创建web项目 1: 2: 3: 4: 5:maven web项目创建成功.(去掉ind ...

  9. Book-MySQL-Operate

    创建数据库 CREATE DATABASE db_name 查看数据库 SHOW DATABASES 选择数据库 USE db_name 删除数据库 DROP DATABASE db_name 列主键 ...

  10. git分支的理解

    分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...