結果
問題 | No.206 数の積集合を求めるクエリ |
ユーザー | yuppe19 😺 |
提出日時 | 2016-07-07 18:42:41 |
言語 | C++11 (gcc 11.4.0) |
結果 |
CE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,426 bytes |
コンパイル時間 | 448 ms |
コンパイル使用メモリ | 52,620 KB |
最終ジャッジ日時 | 2024-11-14 19:46:29 |
合計ジャッジ時間 | 1,033 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
main.cpp:7:30: error: ‘vector’ has not been declared 7 | static void fmt(const int, vector<i64>&); | ^~~~~~ main.cpp:7:36: error: expected ‘,’ or ‘...’ before ‘<’ token 7 | static void fmt(const int, vector<i64>&); | ^ main.cpp:8:31: error: ‘vector’ has not been declared 8 | static void ifmt(const int, vector<i64>&); | ^~~~~~ main.cpp:8:37: error: expected ‘,’ or ‘...’ before ‘<’ token 8 | static void ifmt(const int, vector<i64>&); | ^ main.cpp:9:33: error: ‘vector’ has not been declared 9 | static void convol(const int, vector<i64>&, vector<i64>&); | ^~~~~~ main.cpp:9:39: error: expected ‘,’ or ‘...’ before ‘<’ token 9 | static void convol(const int, vector<i64>&, vector<i64>&); | ^ main.cpp:14:32: error: ‘vector’ has not been declared 14 | static void myfmt(const int, vector<i64>&, const bool); | ^~~~~~ main.cpp:14:38: error: expected ‘,’ or ‘...’ before ‘<’ token 14 | static void myfmt(const int, vector<i64>&, const bool); | ^ main.cpp:17:53: error: return type ‘class std::tuple<long long int, long long int, long long int>’ is incomplete 17 | tuple<i64, i64, i64> extgcd(const i64 x, const i64 y) { | ^ main.cpp: In function ‘void extgcd(i64, i64)’: main.cpp:18:23: error: ‘make_tuple’ was not declared in this scope 18 | if(y == 0) { return make_tuple(1LL, 0LL, x); } | ^~~~~~~~~~ main.cpp:3:1: note: ‘std::make_tuple’ is defined in header ‘<tuple>’; did you forget to ‘#include <tuple>’? 2 | #include <algorithm> +++ |+#include <
ソースコード
#include <iostream> #include <algorithm> using namespace std; using i64 = long long; struct FMT { static void fmt(const int, vector<i64>&); static void ifmt(const int, vector<i64>&); static void convol(const int, vector<i64>&, vector<i64>&); private: static constexpr i64 O = 3LL; static constexpr i64 M = 1224736769LL; static constexpr i64 N = M - 1; static void myfmt(const int, vector<i64>&, const bool); }; tuple<i64, i64, i64> extgcd(const i64 x, const i64 y) { if(y == 0) { return make_tuple(1LL, 0LL, x); } i64 a, b, d; tie(a, b, d) = extgcd(y, x%y); return make_tuple(b, a-x/y*b, d); } i64 mod_inv(const i64 a, const i64 m) { i64 x, _, d; tie(x, _, d) = extgcd(a, m); return (x % m + m) % m; } i64 mod_pow(const i64 a, const i64 r, const i64 n, const i64 m) { if(n == 0) { return r; } if(n & 1) { return mod_pow(a, a*r%m, n-1, m); } return mod_pow(a*a%m, r, n>>1, m); } i64 mod_pow(const i64 a, const i64 n, const i64 m) { return mod_pow(a, 1, n, m); } void FMT::myfmt(const int logn, vector<i64> &a, const bool inv) { const int n = 1 << logn; for(int H=1, W=n>>1; H<n; H<<=1, W>>=1) { vector<i64> y = a; i64 r = mod_pow(O, N/(H*2), M); if(inv) { r = mod_inv(r, M); } i64 w = 1; for(int k=0; k<H; ++k) { for(int j=0; j<W; ++j) { i64 y0 = y[2*W*k+j], y1 = y[2*W*k+j+W] * w % M; a[W* k +j] = y0 + y1 < M ? y0 + y1 : y0 + y1 - M; a[W*(k+H)+j] = y0 < y1 ? y0 - y1 + M : y0 - y1; } w = w * r % M; } } } void FMT::fmt(const int logn, vector<i64> &a) { myfmt(logn, a, false); } void FMT::ifmt(const int logn, vector<i64> &a) { myfmt(logn, a, true); int n = 1 << logn; i64 inv = mod_inv(n, M); for(int i=0; i<n; ++i) { a[i] = a[i] * inv % M; } } void FMT::convol(const int logn, vector<i64> &a, vector<i64> &b) { fmt(logn, a); fmt(logn, b); for(int i=0; i<1<<logn; ++i) { a[i] = a[i] * b[i] % M; } ifmt(logn, a); } int main(void) { cin.tie(0); ios::sync_with_stdio(false); int L, M, N, Q; cin >> L >> M >> N; int size = (N + 1) * 2; int m; for(m=0; 1<<m <= 2*size; ++m) /* nop */ ; vector<i64> p(1<<m, 0), q(1<<m, 0); for(int i=0; i<L; ++i) { int x; cin >> x; p[x] = true; } for(int i=0; i<M; ++i) { int x; cin >> x; q[N-x] = true; } FMT::convol(m, p, q); cin >> Q; for(int v=0; v<Q; ++v) { cout << p[N+v] << '\n'; } return 0; }