結果
| 問題 |
No.206 数の積集合を求めるクエリ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-09-19 09:12:40 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 336 ms / 7,000 ms |
| コード長 | 4,230 bytes |
| コンパイル時間 | 2,020 ms |
| コンパイル使用メモリ | 203,092 KB |
| 最終ジャッジ日時 | 2025-02-07 12:20:35 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
#include <bits/stdc++.h>
#include <complex>
#include <random>
using namespace std;
//#include <atcoder/all>
//using namespace atcoder;
using ll = long long;
using vll = vector<ll>;
using vvll = vector<vll>;
using vvvll = vector<vvll>;
using vvvvll = vector<vvvll>;
using vvvvvll = vector<vvvvll>;
using vvvvvvll = vector<vvvvvll>;
using vb = vector<bool>;
using vvb = vector<vb>;
using vvvb = vector<vvb>;
using vvvvb = vector<vvvb>;
using vd = vector<double>;
using vvd = vector<vd>;
using vvvd = vector<vvd>;
using vvvvd = vector<vvvd>;
using vvvvvd = vector<vvvvd>;
#define all(A) A.begin(),A.end()
#define ALL(A) A.begin(),A.end()
#define rep(i, n) for (ll i = 0; i < (ll) (n); i++)
using pqr = priority_queue<pair<ll, ll>, vector<pair<ll, ll>>, greater<pair<ll, ll>>>;
#define tN(t) (t==1?XN:YN)
#define tS(t) (t==1?XS:YS)
#define tA(t) (t==1?XA:YA)
template<class T>
bool chmax(T& p, T q, bool C = 1) {
if (C == 0 && p == q) {
return 1;
}
if (p < q) {
p = q;
return 1;
}
else {
return 0;
}
}
template<class T>
bool chmin(T& p, T q, bool C = 1) {
if (C == 0 && p == q) {
return 1;
}
if (p > q) {
p = q;
return 1;
}
else {
return 0;
}
}
ll gcd(ll(a), ll(b)) {
if (b == 0)return a;
ll c = a;
while (a % b != 0) {
c = a % b;
a = b;
b = c;
}
return b;
}
vector<ll> fact, factinv, inv;
ll mod = 998244353;
void prenCkModp(ll n) {
fact.resize(n + 5);
factinv.resize(n + 5);
inv.resize(n + 5);
fact.at(0) = fact.at(1) = 1;
factinv.at(0) = factinv.at(1) = 1;
inv.at(1) = 1;
for (ll i = 2; i < n + 5; i++) {
fact.at(i) = (fact.at(i - 1) * i) % mod;
inv.at(i) = mod - (inv.at(mod % i) * (mod / i)) % mod;
factinv.at(i) = (factinv.at(i - 1) * inv.at(i)) % mod;
}
}
ll nCk(ll n, ll k) {
if (n < k) return 0;
return fact.at(n) * (factinv.at(k) * factinv.at(n - k) % mod) % mod;
}
/*
ll modPow(long long a, long long n, long long p) {
if (n == 0) return 1; // 0乗にも対応する場合
if (n == 1) return a % p;
if (n % 2 == 1) return (a * modPow(a, n - 1, p)) % p;
long long t = modPow(a, n / 2, p);
return (t * t) % p;
}*/
ll modPow(ll a,ll n,ll p){
ll res=1;
ll k=a;
while(n>0){
if(n%2==1){
res*=k;
if(res>p)res%=p;
}
k=k*k;
if(k>p)k%=p;
n/=2;
}
return res;
}
const ll NTTmod=998244353;
ll inva(ll N,ll mod=998244353) {
return modPow(N,mod-2,mod);
}
void NTT(vector<ll>& V,int inv){
ll len=V.size();
if(len==1)return;
ll m=len;
ll k=2;
ll baseb=modPow(3,(NTTmod-1)/len,NTTmod);
if(inv==-1)baseb=inva(baseb);
vector<ll> NV(len);
while(m>1){
int hm=(m>>1);
ll a=1,b=3;
b=modPow(baseb,hm,NTTmod);
rep(i,hm){
a=1;
rep(d,k){
int id=i+hm*d;
int ide=i+m*d;
int ido=i+hm+m*d;
if(ide>=len)ide-=len;
if(ido>=len)ido-=len;
ll s=V[ide];
ll t=a*V[ido]%NTTmod;
s%=NTTmod;
NV[id]=(s+t)%NTTmod;
//NV[(id+m)%len]=(s-t+NTTmod);
a*=b;
if(a>NTTmod)a%=NTTmod;
}
}
V=NV;
m=(m>>1);
k*=2;
}
}
template<class T>
vector<ll> multiply(vector<T> f,vector<T> g){
int len=1;
while(len<f.size()+g.size())len*=2;
vector<ll> cf(len,0),cg(len,0);
rep(i,f.size())cf[i]=f[i];
rep(i,g.size())cg[i]=g[i];
NTT(cf,1);
NTT(cg,1);
rep(i,len){
cf[i]*=cg[i];
cf[i]%=NTTmod;
}
NTT(cf,-1);
vector<ll> res(len);
rep(i,len)res[i]=(cf[i]*inva(len))%NTTmod;
return res;
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
ll L,M,N;
cin>>L>>M>>N;
vll A(N,0),B(N,0);
rep(i,L){
ll a;
cin>>a;
A[a-1]++;
}
rep(i,M){
ll b;
cin>>b;
b--;
B[b]++;
}
reverse(all(B));
auto C=multiply(A,B);
ll Q;
cin>>Q;
rep(q,Q){
cout<<C[N+q-1]<<endl;
}
}