Submission #200856

#TimeUsernameProblemLanguageResultExecution timeMemory
200856jh05013씽크스몰 (kriii3_TT)C++17
20 / 30
310 ms46444 KiB
#include <bits/stdc++.h> #define sz(X) (int)((X).size()) #define entire(X) X.begin(),X.end() using namespace std; typedef long long ll; void OJize(){cin.tie(NULL);ios_base::sync_with_stdio(false);} template <class T1, class T2>ostream&operator<<(ostream &os,pair<T1,T2>const&x){os<<'('<<x.first<<", "<<x.second<<')';return os;} template <class Ch, class Tr, class Container>basic_ostream<Ch,Tr>&operator<<(basic_ostream<Ch,Tr>&os,Container const&x){for(auto&y:x)os<<y<<" ";return os;} const double PI = acos(-1); typedef complex<double> CD; typedef vector<CD> VCD; typedef vector<ll> poly; void FFT(VCD &A, bool inv){ int n = A.size(); for(int i=1, j=0; i<n; i++){ for(int k=n>>1; (j^=k)<k; k>>= 1); if(i < j) swap(A[i], A[j]); } double ang = 2*PI / n * (inv? -1:1); VCD roots(n/2); for(int i=0; i<n/2; i++) roots[i] = CD(cos(ang*i), sin(ang*i)); for(int i=2; i<=n; i<<= 1){ int step = n/i; for(int j=0; j<n; j+=i) for(int k=0; k<i/2; k++){ CD u = A[j+k], v = A[j+k+i/2] * roots[step*k]; A[j+k] = u+v, A[j+k+i/2] = u-v; } } if(inv) for(int i=0; i<n; i++) A[i]/= n; } /* Kriiicon Thinksmall: precise multiplication */ poly thinksmall(poly X, poly Y){ int N = 2; while(N < sz(X)+sz(Y)) N<<= 1; VCD A(N), B(N), AR(N), BR(N); for(int i=0; i<sz(X); i++) A[i] = CD(X[i]>>15, X[i]&32767); for(int i=0; i<sz(Y); i++) B[i] = CD(Y[i]>>15, Y[i]&32767); FFT(A, 0); FFT(B, 0); for(int i=0; i<N; i++){ int j = i? N-i : i; CD f1 = (A[i] + conj(A[j])) / CD(2, 0), f2 = (A[i] - conj(A[j])) / CD(0, 2), f3 = (B[i] + conj(B[j])) / CD(2, 0), f4 = (B[i] - conj(B[j])) / CD(0, 2); AR[i] = f1 * (f3 + f4 * CD(0, 1)); BR[i] = f2 * (f3 + f4 * CD(0, 1)); } FFT(AR, 1); FFT(BR, 1); vector<ll> ans; for(int i=0; i<N; i++){ ll ar = roundl(real(AR[i])), ai = roundl(imag(AR[i])), br = roundl(real(BR[i])), bi = roundl(imag(BR[i])); ll res = bi + ((ai + br) << 10) + (ar << 20); ans.push_back(res); } return ans; } int main(){OJize(); int n, m; cin>>n>>m; poly X(n+1), Y(m+1); for(int i=0; i<=n; i++) cin>>X[i]; for(int i=0; i<=m; i++) cin>>Y[i]; ll ans = 0; for(ll x: thinksmall(X, Y)) ans^= x; cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...