题目描述
長さ 2N の整数列 A = (A0, A1, …, A2N−1) が与えられます。
また、Q 個のクエリが与えられます。 i = 1, 2, …, Q について、i 番目のクエリでは 2 つの整数 Xi, Yi が与えられ、下記の操作を行います。
j = 0, 1, 2, …, 2N−1 の順に下記の手順を行う。
- まず、j の N 桁の 2 進数表現を bN−1bN−2… b0 とおく。また、bN−1bN−2… b0 から bXi を反転( 0 ならば 1 に、1 ならば 0 に変更)させて得られる 2 進数表現によって表される整数を j′ とおく。
- そして、bXi = Yi ならば、Aj′ に Aj の値を加算する。
すべてのクエリを入力で与えられる順番に実行した後の A の各要素を 998244353 で割ったあまりを出力してください。
N 桁の 2 進数表現とは?非負整数 X (0 ≤ X ) の N 桁の 2 進数表現とは、0 と 1 のみからなり下記の条件を満たす唯一の、長さ N の列 bN−1bN−2… b0です。
- ∑i = 0N−1 bi ⋅ 2i = X
输入格式
入力は以下の形式で標準入力から与えられる。
N Q A0 A1 … A2N−1 X1 Y1 X2 Y2 ⋮ XQ YQ
输出格式
i = 0, 1, …, 2N−1 について、すべてのクエリを実行した後の Ai を 998244353 で割ったあまり Ai′ を、下記の形式にしたがって空白区切りで出力せよ。
A0′ A1′ … A2N−1′
题目大意
给定一个整数 n 和一个长度为 2n−1 的序列 A(下标从 0 开始)。你需要按顺序执行 Q 次操作,每次操作内容如下:
- 给定两个整数 X,Y,若整数 i∈[0,2n) 满足它的二进制第 X 位(位数从 0 开始)为 Y,设 i 翻转第 X 位后的值为 i′,则让 Ai′ 的值加上 Ai。
所有操作执行完后,请输出整个序列 A。
$1\le N\le 18,\ 1\le Q\le 2\times 10^5,\ 0\le X\le N-1,\ Y\in \{0,1\}$。
2 2
0 1 2 3
1 1
0 0
2 6 2 5
3 10
606248357 338306877 919152167 981537317 808873985 845549408 680941783 921035119
1 1
0 0
0 0
0 0
0 1
0 1
0 1
2 0
2 0
2 0
246895115 904824001 157201385 744260759 973709546 964549010 61683812 205420980
提示
制約
- 1 ≤ N ≤ 18
- 1 ≤ Q ≤ 2 × 105
- 0 ≤ Ai < 998244353
- 0 ≤ Xi ≤ N−1
- Yi ∈ { 0, 1}
- 入力はすべて整数
Sample Explanation 1
1 番目のクエリに対する操作は次の通りです。 - j = 0 のとき、b1b0 = 00, j′ = 2 です。b1 = 1 であるので、加算の手順は行いません。 - j = 1 のとき、b1b0 = 01, j′ = 3 です。b1 = 1 であるので、加算の手順は行いません。 - j = 2 のとき、b1b0 = 10, j′ = 0 です。b1 = 1 であるので、A0 に A2 の値を加算します。その結果、A = (2, 1, 2, 3) となります。 - j = 3 のとき、b1b0 = 11, j′ = 1 です。b1 = 1 であるので、A1 に A3 の値を加算します。その結果、A = (2, 4, 2, 3) となります。 2 番目のクエリに対する操作は次の通りです。 - j = 0 のとき、b1b0 = 00, j′ = 1 です。b0 = 0 であるので、A1 に A0 の値を加算します。その結果、A = (2, 6, 2, 3) となります。 - j = 1 のとき、b1b0 = 01, j′ = 0 です。b0 = 0 であるので、加算の手順は行いません。 - j = 2 のとき、b1b0 = 10, j′ = 3 です。b0 = 0 であるので、A3 に A2 の値を加算します。その結果、A = (2, 6, 2, 5) となります。 - j = 3 のとき、b1b0 = 11, j′ = 2 です。b0 = 0 であるので、加算の手順は行いません。 以上より、すべてのクエリを実行した後の A は (2, 6, 2, 5) です。