HDU 6085 Rikka with Candies

来源:互联网 发布:达内java视频百度网盘 编辑:程序博客网 时间:2024/06/07 10:55

这里写图片描述
题意:
给出一个A数组中有n个数, B数组中有m个数, 再给出q个询问每个询问为k, 求有多少对pair (i, j)使得AiBj取余为k结果对2取余。
代码:

# include <bits/stdc++.h>using namespace std;typedef long long LL;const int INF = 0x3f3f3f3f;const int Q = 1e9+7;const int N = 10;bitset<N> a, b;int ans[N], vis[N];void solve (){    int n, m, q, x, M = -INF;    a.reset (), b.reset ();    memset (vis, 0, sizeof(vis));    scanf ("%d%d%d", &n, &m, &q);    while (n--) {        scanf ("%d", &x);        a.set (x);    }    while (m--) {        scanf ("%d", &x);        vis[x] = 1;        M = max(x, M);    }    for (int i=M; i>=0; --i) {//因为k必须小于等于Bi则从最大值开始遍历        ans [i] = (b & (a >> i)).count () & 1;//a>>i表示a中每一个元素都减去i, 并且丢弃小于零的情况                                            //当b在i位和a中在i位的位同为1时则表示Ai-k对Bi取余为0        if (vis[i]) {            for (int j=0; j<N; j+=i) {                b.flip (j);//将b中每隔i位进行取反,记录i的倍数,如果期间有重复,则表示反转了偶数次,对2取余位零, 因此可以忽略不计            }        }    }    while (q--) {        scanf ("%d", &x);        printf ("%d\n", ans [x]);    }}int main (){    int T;    scanf ("%d", &T);    while (T--) {        solve ();    }    return 0;}
原创粉丝点击