mod=998244353 MOD=mod class Convolution: def __init__(self): # self.mod = mod self.g = self.primitive_root(MOD) self.first_butterfly = True self.first_butterfly_inv = True self.sum_e = [0] * 30 self.sum_ie = [0] * 30 # 原始根の取得 def primitive_root(self, m: int): if (m == 2): return 1 if (m == 167772161): return 3 if (m == 469762049): return 3 if (m == 754974721): return 11 if (m == 998244353): return 3 divs = [0] * 20 divs[0] = 2 cnt = 1 x = (m-1)//2 while(x % 2 == 0): x //= 2 for i in range(3, x+1, 2): if(i**2 > x): break if(x % i == 0): divs[cnt] = i cnt += 1 while(x % i == 0): x //= i if(x > 1): divs[cnt] = x cnt += 1 g = 2 while(True): ok = True for i in range(cnt): if(pow(g, (m-1)//divs[i], m) == 1): ok = False break if(ok): return g g += 1 print('error') return 0 def butterfly(self, a: list): # MOD = self.mod n = len(a) h = (n-1).bit_length() if(self.first_butterfly): self.first_butterfly = False es = [0] * 30 ies = [0] * 30 mod_m = MOD-1 cnt2 = (mod_m & -mod_m).bit_length() - 1 e = pow(self.g, mod_m >> cnt2, MOD) ie = pow(e, MOD-2, MOD) for i in range(cnt2-2, -1, -1): es[i] = e ies[i] = ie e *= e e %= MOD ie *= ie ie %= MOD now = 1 for i in range(cnt2-1): self.sum_e[i] = (es[i] * now) % MOD now *= ies[i] now %= MOD for ph in range(1, h+1): w = 1 << (ph-1) p = 1 << (h-ph) now = 1 for s in range(w): offset = s << (h-ph+1) for i in range(p): l = a[i + offset] r = a[i + offset + p] * now a[i + offset] = (l+r) % MOD a[i + offset + p] = (l-r) % MOD now *= self.sum_e[(~s & -~s).bit_length() - 1] now %= MOD def butterfly_inv(self, a: list): # MOD = self.mod n = len(a) h = (n-1).bit_length() if(self.first_butterfly_inv): self.first_butterfly_inv = False es = [0] * 30 ies = [0] * 30 mod_m = MOD-1 cnt2 = (mod_m & -mod_m).bit_length() - 1 e = pow(self.g, mod_m >> cnt2, MOD) ie = pow(e, MOD-2, MOD) for i in range(cnt2-2, -1, -1): es[i] = e ies[i] = ie e *= e e %= MOD ie *= ie ie %= MOD now = 1 for i in range(cnt2-1): self.sum_ie[i] = (ies[i] * now) % MOD now *= es[i] now %= MOD for ph in range(h, 0, -1): w = 1 << (ph-1) p = 1 << (h-ph) inow = 1 for s in range(w): offset = s << (h-ph+1) for i in range(p): l = a[i + offset] r = a[i + offset + p] a[i + offset] = (l+r) % MOD a[i + offset + p] = ((l - r) * inow) % MOD inow *= self.sum_ie[(~s & -~s).bit_length() - 1] inow %= MOD def convolution(self, a: list, b: list): # MOD = self.mod n = len(a) m = len(b) if(n == 0) | (m == 0): return [] if(min(n, m) <= 60): if(n < m): a, b = b, a n, m = m, n ans = [0] * (n+m-1) for i in range(n): for j in range(m): ans[i+j] += a[i] * b[j] ans[i+j] %= MOD return ans z = 1 << (n+m-2).bit_length() a += [0] * (z-n) b += [0] * (z-m) self.butterfly(a) self.butterfly(b) for i in range(z): a[i] *= b[i] a[i] %= MOD self.butterfly_inv(a) a = a[:(n+m-1)] iz = pow(z, MOD-2, MOD) for i in range(n+m-1): a[i] *= iz a[i] %= MOD return a N,M=map(int, input().split()) A=list(map(int, input().split())) B=list(map(int, input().split())) C=list(map(int, input().split())) D=[1] for i in range(N): a,b,c=A[i],B[i],C[i] E=[0]*max(a+1,b+1,c+1) E[a]+=1;E[b]+=1;E[c]+=1 cnv=Convolution() D=cnv.convolution(D,E) ans=0 for d in D: if d!=0: ans+=1 print(ans)