【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=6085

【题目大意】

  给出一个数组a一个数组b,以及询问数组c,
  问对于每个c有多少对a%b=c,答案对2取模

【题解】

  考虑对2取模我们发现答案等价于数字的xor,01状态可以用bitset保存,
  在bitset上存a的权值数组,那么每次只要将b*i~b*(i+1)-1的数值xor到答案数组的0~b-1上去即可,
  鉴于bitset没有截取区间的功能,我们手写压位,
  考虑压32位之后不是32倍数的部分截取起来非常尴尬,
  因此我们保存其偏移量为0~31的数组,这样取区间就比较方便了。

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=10010;
struct Bitset{
unsigned int u[N];
void reset(){memset(u,0,sizeof(u));}
void set(int x){u[x>>5]|=1<<(x&31);}
void flip(int x){u[x>>5]^=1<<(x&31);}
bool test(int x){return u[x>>5]&(1<<(x&31));}
void reset(int x){if(test(x))flip(x);}
}a[32],ans;
void Solve(int l,int r){
while((r-l)&31){r--;if(a[0].test(r))ans.flip(r-l);}
int m=0; while(l&31)l++,r++,m++;
l>>=5; r>>=5;
for(int i=l;i<r;i++)ans.u[i-l]^=a[m].u[i];
}
int T,n,m,q,x,mx;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&q);
for(int i=0;i<32;i++)a[i].reset();
ans.reset(); mx=0;
for(int i=1;i<=n;i++){
scanf("%d",&x); mx=max(x,mx);
for(int j=0;j<32;j++)a[j].set(x+j);
}
for(int i=1;i<=m;i++){
scanf("%d",&x);
for(int j=0;j<=mx;j+=x)Solve(j,min(mx+1,j+x));
}
while(q--){
scanf("%d",&x);
if(ans.test(x))puts("1");
else puts("0");
}
}return 0;
}

HDU 6085 Rikka with Candies(bitset)的更多相关文章

  1. 2017ACM暑期多校联合训练 - Team 5 1001 HDU 6085 Rikka with Candies (模拟)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  2. HDU 6085 - Rikka with Candies | 2017 Multi-University Training Contest 5

    看了标程的压位,才知道压位也能很容易写- - /* HDU 6085 - Rikka with Candies [ 压位 ] | 2017 Multi-University Training Cont ...

  3. 2017多校第5场 HDU 6085 Rikka with Candies bitset

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6085 题意:存在两个长度为n,m的数组A,B.有q个询问,每个询问有一个数字k,可以得到Ai%Bj=k ...

  4. hdu 5423 Rikka with Tree(dfs)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  5. hdu 5631 Rikka with Graph(图)

    n个点最少要n-1条边才能连通,可以删除一条边,最多删除2条边,然后枚举删除的1条边或2条边,用并查集判断是否连通,时间复杂度为O(n^3) 这边犯了个错误, for(int i=0;i<N;i ...

  6. hdu 6085 Rikka with Candies (set计数)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  7. hdu 5423 Rikka with Tree(dfs)bestcoder #53 div2 1002

    题意: 输入一棵树,判断这棵树在以节点1为根节点时,是否是一棵特殊的树. 相关定义: 1.  定义f[A, i]为树A上节点i到节点1的距离,父节点与子节点之间的距离为1. 2.  对于树A与树B,如 ...

  8. HDU 6126 Give out candies(网络流)

    题目给出n,m,k 然后给出n*m的矩阵a[i][j]代表第i个人在获得j 颗糖果能得到的满足值, 然后k是k行每行输入三个整数x,y,z     ,x,y,z表示一组限制表示第x个人分到的糖数减去第 ...

  9. HDU 6092 Rikka with Subset(dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=6092 题意: 给出两个数组A和B,A数组一共可以有(1<<n)种不同的集合组合,B中则记录了每个数出 ...

随机推荐

  1. 我的Mac使用笔记

    此篇记录mac使用相关的一些东西,不断更新中... 1.Mac 安装homebrew : https://brew.sh/index_zh-cn.html /usr/bin/ruby -e " ...

  2. thinkphp crud实例代码

    class IndexAction extends Action { // 查询数据 public function index() { $Form = M("Form"); $l ...

  3. python基础===如何在列表,字典,集合中根据条件筛选数据

    #常见的操作如下: data = [1, 5, -3, -2, 6, 0, 9] res = [] for x in data: if x>=0: res.append(x) print(res ...

  4. Swift中的指针类型

    Swift编程语言为了能与Objective-C与C语言兼容,而引入了指针类型.尽管官方不建议频繁使用指针类型,但很多时候,使用指针能完成更多.更灵活的任务.比如,我们要实现一个交换两个整数值的函数的 ...

  5. caffe Python API 之Accuracy

    net.acc = caffe.layers.Accuracy(net.fc3,net.label) 输出: layer { name: "acc" type: "Acc ...

  6. java在图片上写字

  7. C# 下载文件的四种方法

    C# 文件下载四方法 - CSDN论坛 - CSDN.NET using System; using System.Data; using System.Configuration; using Sy ...

  8. sshd_config OpenSSH SSH 进程配置文件配置说明

    名称 sshd_config – OpenSSH SSH 服务器守护进程配置文件 大纲 /etc/ssh/sshd_config 描述sshd 默认从 /etc/ssh/sshd_config 文件( ...

  9. HDU 2859 Phalanx(二维DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 题目大意:对称矩阵是这样的矩阵,它由“左下到右”线对称. 相应位置的元素应该相同. 例如,这里是 ...

  10. 如何使用OpenSSL工具生成根证书与应用证书

    如何使用OpenSSL工具生成根证书与应用证书 一.步骤简记 // 生成顶级CA的公钥证书和私钥文件,有效期10年(RSA 1024bits,默认) openssl req -new -x509 -d ...