abc432_g Sum of Binom(A, B) 题解
abc432_g Sum of Binom(A, B) 题解
设 \(a_i,b_i\) 分别为 \(A,B\) 中 \(i\) 的个数。
那么所求即为(\(V=5\times 10^5\)):
\[\sum _{i=0}^{V} \sum _{j=0}^V a_ib_j\binom ij
\]
把式子化为
\[\sum _{i=0}^V a_i i! \sum _{j=0}^V \frac {b_j}{(i-j)!j!}
\]
由于右侧 \((i-j)+j=i\),不妨考虑卷积,设 \(f(x)=\sum _{i=0}^V \frac {b_i}{i!}x^i\),\(g(x)=\sum _{i=0}^V \frac 1 {i!}x^i\)。式子变成
\[\sum _{i=0}^{V} a_ii! [x^i](f(x)g(x))
\]
使用 NTT 卷积即可,复杂度 \(O(V\log V)\)。代码如下(使用 atcoder 库中的卷积):
const int N=5e5+5,mod=998244353;
int pow1(int x,int y) {
int res=1;
for(;y;y>>=1,x=(ll)x*x%mod) if(y&1) res=(ll)res*x%mod;
return res;
}
int n,m;
int A[N],B[N];
int fac[N],ifac[N];
int a[N],b[N];
void Main() {
fac[0]=ifac[0]=1;
fu(i,1,N) {
fac[i]=1ll*fac[i-1]*i%mod;
ifac[i]=1ll*ifac[i-1]*fac[i]%mod;
}
ifac[N-1]=pow1(ifac[N-1],mod-2);
fd(i,N-1,1) {
int t=ifac[i-1];
ifac[i-1]=1ll*fac[i]*ifac[i]%mod;
ifac[i]=1ll*ifac[i]*t%mod;
}
cin>>n>>m;
fo(i,1,n) cin>>A[i],a[A[i]]++;
fo(i,1,m) cin>>B[i],b[B[i]]++;
vi f(N),g(N);
fu(i,0,N) f[i]=1ll*b[i]*ifac[i]%mod,g[i]=ifac[i];
f=atcoder::convolution(f,g);
int ans=0;
fu(i,0,N) {
ans=(ans+1ll*a[i]*fac[i]%mod*f[i])%mod;
}
cout<<ans<<'\n';
}

浙公网安备 33010602011771号