Luogu P5564. 「Celeste-B」Say Goodbye

\(n\) 个点,染 \(m\) 种颜色,第 \(i\) 种颜色染恰好 \(c_i\) 个节点,满足 \(c_1+c_2+\cdots+c_m=n\)
求这 \(n\) 个点组成的本质不同的无标号基环(无自环)树个数(子树有序),答案对 \(998244353\) 取模。
两棵基环树本质相同当且仅当通过环的旋转(不能翻转)后能使得它们完全相同。
\(1\le m\le n\le 2\cdot 10^5\)


首先考虑计算大小为 \(n\) 的无标号有根树(子树有序)的数量,以树的括号序统计方案数,由于最外面两个括号确定,因此答案为 \(\text{Cat}_{n-1}\)

枚举环长 \(k\),考虑用 \(\text{Burnside}\) 引理统计答案。

\[\color{blue}{\textbf{Ans}}=\sum_{k=2}^{n}\frac{1}{k}\sum_{d|k}f_{k}(\frac{k}{d})\varphi(d) \]

其中 \(f_{k}(\frac{k}{d})\) 表示环长为 \(k\) 的基环树,以 \(\frac{k}{d}\) 为循环子树相同的方案数。

只需要钦定其中的 \(\frac{k}{d}\) 棵即可,一棵无标号有根有序树的 OGF 为 \(xC\),那么要求的即为 \([x^{\frac{n}{d}}](xC)^\frac{k}{d}\)。代入式子

\[\begin{aligned} {\textbf{Ans}}&=\sum_{k=2}^{n}\frac{1}{k}\sum_{d|k}\left[d\:\middle|\:\gcd_{i=1}^m c_i\right]\varphi(d)col(d)[x^{\frac{n}{d}}](xC)^\frac{k}{d}\\ &=-\text{Cat}_{n-1}g(1)+\sum_{d\mid \gcd}\varphi(d)col(d)\sum_{k=1}^{\frac{n}{d}}\frac{1}{kd}[x^{\frac{n}{d}}](xC)^k\\ &=-\text{Cat}_{n-1}g(1)+\sum_{d\mid \gcd}\frac{\varphi(d)col(d)}{d}\sum_{k=1}^{\frac{n}{d}}\frac{1}{k}[x^{\frac{n}{d}-k}]C^k\\ \end{aligned} \]

其中 \(col(d)\) 是染色的方案数,\(col(d)=\frac{(n/d)!}{\prod (c_i/d)!}\)

运用拓展拉格朗日反演 \([x^n]H(F(x))=\frac{1}{n}[x^{-1}]H'(x)(\frac{1}{G(x)})^n=\frac{1}{n}[x^{n-1}]H'(x)(\frac{x}{G(x)})^n\),已知 \(C=xC^2+1\),则 \(x=\frac{C-1}{C^2}\)\(G(x)=\frac{x-1}{x^2}\)\(H(x)=x^m\),得到 \([x^n]C^{m}=\frac{m}{n}\binom{2n-m-1}{n-1}\)

那么直接对式子计算,总时间复杂度为 \(\mathcal O(\sigma(n)+\sigma_0(n)m)\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=6e5+5,mod=998244353;
int n,k,G,cnt,ans,a[N],phi[N],vis[N],p[N];ll fac[N],inv[N],Inv[N];
inline void precalc(int n){
	fac[0]=inv[0]=Inv[0]=fac[1]=inv[1]=Inv[1]=1;
	for(int i=2;i<=n;++i)
		fac[i]=fac[i-1]*i%mod,
		Inv[i]=(mod-mod/i)*Inv[mod%i]%mod,
		inv[i]=inv[i-1]*Inv[i]%mod;
}
inline ll C(int n,int m){return fac[n]*inv[m]%mod*inv[n-m]%mod;}
inline ll col(int d){
	ll ans=fac[n/d];
	for(int i=1;i<=k;++i)ans=ans*inv[a[i]/d]%mod;
	return ans;
}
inline ll Cat(int n,int m){
	return(inv[n]*inv[n+m-1]%mod-inv[n-1]*inv[n+m]%mod+mod)%mod*fac[n+n+m-1]%mod;
}
int main(){
	precalc(N-1),phi[1]=1;
	for(int i=2;i<N;++i){
		if(!vis[i])p[++cnt]=i,phi[i]=i-1;
		for(int j=1;1LL*i*p[j]<N&&j<=cnt;++j){
			vis[i*p[j]]=1;
			if(i%p[j]==0){phi[i*p[j]]=phi[i]*p[j];break;}
			else phi[i*p[j]]=phi[i]*(p[j]-1);
		}
	}
	scanf("%d%d",&n,&k);
	for(int i=1;i<=k;++i)scanf("%d",a+i),G=__gcd(G,a[i]);
	ans=-Cat(n-1,1)*col(1)%mod;
	for(int d=1;d<=G;++d)if(G%d==0){
		int sum=0;
		for(int p=1;p<=n/d;++p)
			(sum+=Inv[p]*Cat(n/d-p,p)%mod)%=mod;
		(ans+=phi[d]*col(d)%mod*Inv[d]%mod*sum%mod)%=mod;
	}
	return printf("%d\n",(ans+mod)%mod),0;
}
posted @ 2022-07-24 08:00  Samsara-soul  阅读(35)  评论(0编辑  收藏  举报