CF1528E Mashtali and Hagh Trees 题解

Link.

Codeforces
Luogu

P.S.

上文

Solution.

观察三条件,抽象出树可能是以下三种

  1. 有根外向树
  2. 有根内向树
  3. 内向外向拼起来

设有根且根度数为 2 的方案数是 {Fi}

  1. 根度为 1,为 Fn1
  2. 根的点度为 2,且左右深度不相同,为 Fn1×(i=0n2Fi)
  3. 根的点度为 2,且左右深度相同,为 Fn1×(Fn1+1)2

Fn=Fn1+Fn1×(i=0n2Fi)+Fn1×(Fn1+1)2=Fn1+Fn1×(i=0n2Fi)+(Fn1+12)

所以我们可以在 O(n) 的复杂度内求出 {Fi}

统计答案,发现 12 都分别有下式种方案。

Fn+Fn1×(1+i=0n2Fi2)+(i=0n2Fi)×(Fn1+12)+(Fn1+23)

但是我们需要注意的是一条链的情况 12 会算重,所以两倍后要减 1

与此同时,第三种情况的计算比较复杂。
首先左边的有根内向树是 Fi1,因为不能退化成链。
右边的是 Fni1Fni2,因为根度不能为一。
所以答案是 i=0n1(Fi1)×(Fni1Fni2)

最后答案加一下就好了。

Coding.

点击展开代码
//是啊……你就是那只鬼了……所以被你碰到以后,就轮到我变成鬼了{{{
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
template<typename T>inline void read(T &x)
{
	x=0;char c=getchar(),f=0;
	for(;c<48||c>57;c=getchar()) if(!(c^45)) f=1;
	for(;c>=48&&c<=57;c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	f?x=-x:x;
}/*}}}*/
const int P=998244353;int n,F[1000005],s[1000005];
inline int ksm(int x,int q=P-2) {int r=1;for(;q;q>>=1,x=1ll*x*x%P) if(q&1) r=1ll*r*x%P;return r;}
inline int C2(int x) {return 1ll*x*(x+1)%P*499122177%P;}
inline int C3(int x) {return 1ll*x*(x+1)%P*(x+2)%P*166374059%P;}
int main()
{
	read(n),F[0]=1,F[1]=2,s[0]=1,s[1]=3;int rs=0;
	if(n==1) return puts("5"),0;else if(n==2) return puts("31"),0;
	for(int i=2;i<=n;i++) F[i]=(F[i-1]+1ll*F[i-1]*s[i-2]+C2(F[i-1]))%P,s[i]=(s[i-1]+F[i])%P;
	rs=(2ll*F[n]-1+2ll*C3(F[n-1])+2ll*F[n-1]*C2(s[n-2])+2ll*s[n-2]*C2(F[n-1]))%P;
	for(int i=0;i<n-1;i++) rs=(rs+1ll*(F[i]-1)*(F[n-i-1]-F[n-i-2]))%P;
	return printf("%d\n",rs),0;
}
posted @   Peal_Frog  阅读(176)  评论(3编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示

目录导航