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';
}
posted @ 2025-11-16 19:45  dengchengyu  阅读(23)  评论(0)    收藏  举报