#include using namespace std; vector shiftVec(const vector& v, int s, int L) { int nblock = v.size(); vector res(nblock, 0); int bs = s / 64; int r = s % 64; for (int i = nblock - 1; i >= 0; i--) { int j = i - bs; if(j < 0) continue; uint64_t cur = v[j] << r; uint64_t carry = 0; if(r && j > 0) carry = v[j-1] >> (64 - r); uint64_t val = cur | carry; res[i] |= val; } int full = L / 64; int rem = L % 64; if(full < nblock && rem != 0){ res[full] &= ((uint64_t)1 << rem) - 1; for (int i = full+1; i < nblock; i++) res[i] = 0; } return res; } void orVec(vector& d, const vector& s) { int n = d.size(); for (int i = 0; i < n; i++) d[i] |= s[i]; } int countVec(const vector& v, int L) { int nblock = v.size(); int full = L / 64; int rem = L % 64; int cnt = 0; for (int i = 0; i < full; i++) cnt += __builtin_popcountll(v[i]); if(full < nblock && rem != 0){ uint64_t mask = ((uint64_t)1 << rem) - 1; cnt += __builtin_popcountll(v[full] & mask); } return cnt; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, F; cin >> N >> F; vector A(N), B(N), C(N); for (int i = 0; i < N; i++) cin >> A[i]; for (int i = 0; i < N; i++) cin >> B[i]; for (int i = 0; i < N; i++) cin >> C[i]; int max_sum = N * F; int L = max_sum + 1; int nblock = (L + 63) / 64; vector dp(nblock, 0); dp[0] = 1; int cur = 0; for (int i = 0; i < N; i++){ cur += F; int Lnow = cur + 1; vector ndp(nblock, 0); vector t; t = shiftVec(dp, A[i], Lnow); orVec(ndp, t); t = shiftVec(dp, B[i], Lnow); orVec(ndp, t); t = shiftVec(dp, C[i], Lnow); orVec(ndp, t); dp.swap(ndp); cout << countVec(dp, Lnow) << endl; } return 0; }