結果
問題 | No.206 数の積集合を求めるクエリ |
ユーザー | lumc_ |
提出日時 | 2018-03-21 21:15:54 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 646 ms / 7,000 ms |
コード長 | 2,684 bytes |
コンパイル時間 | 2,007 ms |
コンパイル使用メモリ | 167,144 KB |
実行使用メモリ | 19,208 KB |
最終ジャッジ日時 | 2024-06-24 19:41:06 |
合計ジャッジ時間 | 11,540 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 1 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 15 ms
5,376 KB |
testcase_07 | AC | 15 ms
5,376 KB |
testcase_08 | AC | 15 ms
5,376 KB |
testcase_09 | AC | 15 ms
5,376 KB |
testcase_10 | AC | 2 ms
5,376 KB |
testcase_11 | AC | 2 ms
5,376 KB |
testcase_12 | AC | 19 ms
5,376 KB |
testcase_13 | AC | 18 ms
5,376 KB |
testcase_14 | AC | 19 ms
5,376 KB |
testcase_15 | AC | 18 ms
5,376 KB |
testcase_16 | AC | 18 ms
5,376 KB |
testcase_17 | AC | 504 ms
19,080 KB |
testcase_18 | AC | 504 ms
18,956 KB |
testcase_19 | AC | 502 ms
19,208 KB |
testcase_20 | AC | 508 ms
19,080 KB |
testcase_21 | AC | 507 ms
19,084 KB |
testcase_22 | AC | 508 ms
19,076 KB |
testcase_23 | AC | 508 ms
18,956 KB |
testcase_24 | AC | 640 ms
19,208 KB |
testcase_25 | AC | 646 ms
18,948 KB |
testcase_26 | AC | 638 ms
19,208 KB |
testcase_27 | AC | 597 ms
19,084 KB |
testcase_28 | AC | 637 ms
19,084 KB |
testcase_29 | AC | 630 ms
19,080 KB |
testcase_30 | AC | 641 ms
19,200 KB |
ソースコード
#include<bits/stdc++.h> using namespace std; using ll = long long; ll extgcd(ll a, ll b, ll &x, ll &y) { if(b == 0) { x = 1, y = 0; return a; } ll d = extgcd(b, a % b, y, x); y -= a / b * x; return d; } ll modinv(ll a, ll mod) { a = (a % mod + mod) % mod; ll x = 0, y = 0; extgcd(a, mod, x, y); return (x % mod + mod) % mod; } ll modpow(ll a, ll b, ll mod) { a = (a % mod + mod) % mod; ll r = 1; while(b) { if(b & 1) r = r * a % mod; a = a * a % mod; b >>= 1; } return r; } template<ll mod> struct ModInt { ll val; ModInt(): val(0) {} ModInt(ll v): val((v % mod + mod) % mod) {} ModInt operator+(ModInt rhs) { return ModInt<mod>(val + rhs.val); } ModInt operator*(ModInt rhs) { return ModInt<mod>(val * rhs.val); } ModInt operator/(ModInt rhs) { return ModInt<mod>(val * rhs.inv().val); } ModInt operator+=(ModInt rhs) { val = (val + rhs.val) % mod; return *this; } ModInt operator*=(ModInt rhs) { val = (val * rhs.val) % mod; return *this; } ModInt operator/=(ModInt rhs) { val = (val * rhs.inv().val) % mod; return *this; } ModInt inv() { return ModInt<mod>(modinv(val, mod)); } }; template<ll mod, ll primitive> struct NTT { const int Mod = mod; using Int = ModInt<mod>; vector<Int> fft(vector<Int> a, bool inv = 0) { int n = a.size(), n2 = n / 2; if(n == 1) return a; vector<Int> a0(n2), a1(n2); for(int i = 0; i < n2; i++) a0[i] = a[i * 2], a1[i] = a[i * 2 + 1]; a0 = fft(a0); a1 = fft(a1); Int zeta(modpow(primitive, (mod - 1) / n, mod)); if(inv) zeta = zeta.inv(); Int tmp(1); for(int i = 0; i < n; i++) { int ii = i; if(inv) ii = n - i; a[i] = a0[ii % n2] + tmp * a1[ii % n2]; if(inv) a[i] /= Int(n); tmp *= zeta; } return a; } template<typename T> vector<Int> conv(vector<T> at, vector<T> bt) { int deg = at.size() + bt.size(); int n = 1; while(n < deg) n <<= 1; vector<Int> a(n), b(n); for(int i = 0; i < (int) at.size(); i++) a[i] = Int(at[i]); for(int i = 0; i < (int) bt.size(); i++) b[i] = Int(bt[i]); a = fft(a); b = fft(b); vector<Int> c(n); for(int i = 0; i < n; i++) c[i] = a[i] * b[i]; return fft(c, 1); } }; NTT<(1 << 25) * 5 + 1, 3> ntt; int main() { ios::sync_with_stdio(false), cin.tie(0); int l, m , n; cin >> l >> m >> n; vector<int> a(n + 1), b(n + 1); for(int i = 0; i < l; i++) { int x; cin >> x; a[x] = 1; } for(int i = 0; i < m; i++) { int x; cin >> x; b[n - x] = 1; } auto c = ntt.conv(a, b); int q; cin >> q; for(int i = n; i < n + q; i++) { cout << c[i].val << endl; } }