MOD = 998244353
INV3 = pow(3, MOD - 2, MOD)
PRIMITIVE_ROOT = 3 # for MOD = 998244353
def count_valid(n, k, m, arr):
cnt = [0,0,0]
for x in arr:
cnt[x % 3] += 1
c0 = k // 3
c1 = (k + 2) // 3
c2 = (k + 1) // 3
S = n - m
diff = (cnt[1] - cnt[2]) % 3
# case S == 0
if S == 0:
return 1 if (cnt[0] >= 1 and (cnt[1] - cnt[2]) % 3 == 0 and cnt[1] == cnt[2]) else 0
# prepare omega (primitive 3rd root)
w = pow(PRIMITIVE_ROOT, (MOD - 1) // 3, MOD) # omega
w_pows = [1, w, (w * w) % MOD]
def total_with(c0_, c1_, c2_):
# compute sum_{t=0..2} omega^{t*diff} * (c0_ + c1_*omega^t + c2_*omega^{2t})^S
s = 0
for t in range(3):
base = (c0_ + c1_ * w_pows[t] + c2_ * w_pows[(2*t) % 3]) % MOD
val = pow(base, S, MOD)
wt = pow(w_pows[1], (t * diff) % 3, MOD) # omega^{t*diff}; w_pows[1]=omega
s = (s + val * wt) % MOD
return s * INV3 % MOD
total = total_with(c0, c1, c2)
# if prefix has no divisible-by-3, subtract sequences that also choose none (i.e., c0'=0)
if cnt[0] == 0:
bad = total_with(0, c1, c2)
ans = (total - bad) % MOD
else:
ans = total % MOD
return ans
# input driver (the problem statement uses t testcases)
t = int(input().strip())
for _ in range(t):
n, k, m = map(int, input().split())
arr = list(map(int, input().split())) if m > 0 else []
print(count_valid(n, k, m, arr))
TU9EID0gOTk4MjQ0MzUzCklOVjMgPSBwb3coMywgTU9EIC0gMiwgTU9EKQpQUklNSVRJVkVfUk9PVCA9IDMgICMgZm9yIE1PRCA9IDk5ODI0NDM1MwoKZGVmIGNvdW50X3ZhbGlkKG4sIGssIG0sIGFycik6CiAgICBjbnQgPSBbMCwwLDBdCiAgICBmb3IgeCBpbiBhcnI6CiAgICAgICAgY250W3ggJSAzXSArPSAxCiAgICBjMCA9IGsgLy8gMwogICAgYzEgPSAoayArIDIpIC8vIDMKICAgIGMyID0gKGsgKyAxKSAvLyAzCiAgICBTID0gbiAtIG0KICAgIGRpZmYgPSAoY250WzFdIC0gY250WzJdKSAlIDMKCiAgICAjIGNhc2UgUyA9PSAwCiAgICBpZiBTID09IDA6CiAgICAgICAgcmV0dXJuIDEgaWYgKGNudFswXSA+PSAxIGFuZCAoY250WzFdIC0gY250WzJdKSAlIDMgPT0gMCBhbmQgY250WzFdID09IGNudFsyXSkgZWxzZSAwCgogICAgIyBwcmVwYXJlIG9tZWdhIChwcmltaXRpdmUgM3JkIHJvb3QpCiAgICB3ID0gcG93KFBSSU1JVElWRV9ST09ULCAoTU9EIC0gMSkgLy8gMywgTU9EKSAgICAjIG9tZWdhCiAgICB3X3Bvd3MgPSBbMSwgdywgKHcgKiB3KSAlIE1PRF0KCiAgICBkZWYgdG90YWxfd2l0aChjMF8sIGMxXywgYzJfKToKICAgICAgICAjIGNvbXB1dGUgc3VtX3t0PTAuLjJ9IG9tZWdhXnt0KmRpZmZ9ICogKGMwXyArIGMxXypvbWVnYV50ICsgYzJfKm9tZWdhXnsydH0pXlMKICAgICAgICBzID0gMAogICAgICAgIGZvciB0IGluIHJhbmdlKDMpOgogICAgICAgICAgICBiYXNlID0gKGMwXyArIGMxXyAqIHdfcG93c1t0XSArIGMyXyAqIHdfcG93c1soMip0KSAlIDNdKSAlIE1PRAogICAgICAgICAgICB2YWwgPSBwb3coYmFzZSwgUywgTU9EKQogICAgICAgICAgICB3dCA9IHBvdyh3X3Bvd3NbMV0sICh0ICogZGlmZikgJSAzLCBNT0QpICAjIG9tZWdhXnt0KmRpZmZ9OyB3X3Bvd3NbMV09b21lZ2EKICAgICAgICAgICAgcyA9IChzICsgdmFsICogd3QpICUgTU9ECiAgICAgICAgcmV0dXJuIHMgKiBJTlYzICUgTU9ECgogICAgdG90YWwgPSB0b3RhbF93aXRoKGMwLCBjMSwgYzIpCiAgICAjIGlmIHByZWZpeCBoYXMgbm8gZGl2aXNpYmxlLWJ5LTMsIHN1YnRyYWN0IHNlcXVlbmNlcyB0aGF0IGFsc28gY2hvb3NlIG5vbmUgKGkuZS4sIGMwJz0wKQogICAgaWYgY250WzBdID09IDA6CiAgICAgICAgYmFkID0gdG90YWxfd2l0aCgwLCBjMSwgYzIpCiAgICAgICAgYW5zID0gKHRvdGFsIC0gYmFkKSAlIE1PRAogICAgZWxzZToKICAgICAgICBhbnMgPSB0b3RhbCAlIE1PRAogICAgcmV0dXJuIGFucwoKIyBpbnB1dCBkcml2ZXIgKHRoZSBwcm9ibGVtIHN0YXRlbWVudCB1c2VzIHQgdGVzdGNhc2VzKQp0ID0gaW50KGlucHV0KCkuc3RyaXAoKSkKZm9yIF8gaW4gcmFuZ2UodCk6CiAgICBuLCBrLCBtID0gbWFwKGludCwgaW5wdXQoKS5zcGxpdCgpKQogICAgYXJyID0gbGlzdChtYXAoaW50LCBpbnB1dCgpLnNwbGl0KCkpKSBpZiBtID4gMCBlbHNlIFtdCiAgICBwcmludChjb3VudF92YWxpZChuLCBrLCBtLCBhcnIpKQo=