3664: 异或(第三轮02)

内存限制:256 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:4 解决:2

题目描述

鸡尾酒获得了一个数组,他定义数组的价值为每个相邻元素异或之和。例如数组 [3,5,9]  的价值为  (3^5) + (5^9) = 18 ,其中  ^  为二进制中的异或运算。

现在他将数组向右进行 m  次向右循环移动,每次移动 bi 位,循环移动都建立在 上一次移动的基础上进行。现在他想考考你, 每次循环移动过后,这个数组的价 值为多少?

向右循环移动的定义:向右循环移动一位,数组中最右边的元素变成最左边的元 素,其余元素全部向右移动一位。

例如数组  [1,2,3,4,5]  向右循环移动两位的结果是 [4,5,1,2,3]。

输入

输入第一行包含两个正整数 n和m,分别代表数组的长度和循环移动的次数。 

接下来一行包含n个由空格隔开的正整数,分别表示数组中每个数字的长度。 

接下来一行包含m个正整数,分别表示每次循环移动要移动的位数 bi 。

输出

先输出一个答案表示原来数组的价值,然后输出m个整数,表示对于每一次循环 移位后,数组当前的价值。所有输出的整数用空格隔开。

样例输入 复制

5 3
1 2 3 4 5
1 1 2

样例输出 复制

12 15 9 13

提示

【样例 1 输入】

5 3

1 2 3 4 5

1 1 2

【样例 1 输出】

12 15 9 13

【样例 1 说明】

初始时数组价值为  (1^2) + (2^3) + (3^4) + (4^5) = 12。

第一次移位之后,数组变为  [5,1,2,3,4] ,其价值为  (5^1) + (1^2) + (2^3) + (3^4) = 15。

第二次移位之后,数组再次向右循环移动一次,数组变为  [4,5,1,2,3],价值为  9。 第三次移位之后,数组向右移动两次,变为  [2,3,4,5,1], 价值为  13。

【样例 2 输入】

5 5

10 13 2 5 6

4

1

5

1

2

【样例 2输出】

32 37 32 32 41 29

【数据范围】

对于 20%  的数据,满足  n  ≤ 105, m  =  0。

对于另外 40%  的数据,满足  bi    ≤  n  ≤ 10^3, m  ≤  5。 对于  100%  的数据,满足  1   ≤   n, m, ai, bi   ≤ 10^5 。


来源/分类