#include typedef long long ll; typedef unsigned long long ull; #define FOR(i,a,b) for(int (i)=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define RANGE(vec) (vec).begin(),(vec).end() typedef std::complex c_t; // O(n*log(n)) // a.size() must be 2^k void fft(std::vector &a, int dir = 1) { int n = a.size(); int i = 0; for (int j = 0; j < n; ++j) { if (j < i) std::swap(a[i], a[j]); for (int k = (n>>1); k > (i ^= k); k >>= 1) ; } for (int s = 0; (1< &a, const std::vector &b, std::vector &c) { int n = a.size()+b.size()-1; int m = std::ceil(std::log2(n)); std::vector abuf((1< bbuf((1<>L>>M>>N; // // f(x) = ∑ x^A[i] // g(x) = ∑ x^(N-B[i]) (次数がN-B[i]なのは畳み込み後の次数に A[i]-B[i] を入れたいから) // // とするとき // // (f*g)(x) = ∑∑ a[i]b[j] x^(A[i]-B[j]+N) // = ∑ c[i] x^i // // c[N+v] = #{(i,j) | (A[i]-B[j]+N == N+v) } となる // // よって FFT が使える // vector a(N+1,0); vector b(N+1,0); vector c(2*(N+1),0); REP(i,L) { int x; cin>>x; // 次数に対応する係数だけ 1 にする a[x] = 1; } REP(i,M) { int x; cin>>x; b[N-x] = 1; } convolve(a,b,c); int Q; cin>>Q; REP(v,Q) { // round してから cast しないと期待どおりの値にならない cout<<(int)round(c[N+v])<solve(); delete obj; return 0; } #endif