题意:给定一颗 $n$ 个节点的树,定义 $dis(x,y)$ 为树上点 $x$ 到 $y$ 的路径经过的边数.

定义一个点集 $S$ 的 $f(S)$ 为 $f(S)=max\left \{dis(x,y)|x,y\in S\right \}$ $,|S|\geqslant2$

求:对于 $i$ ,有少个点集 $S$ 满足 $|S|\geqslant 2$ 且 $f(S)=i$

题解:

上面那个 $f(S)$ 就是这个点集的直径.

考虑枚举直径,我们知道树上的直径有奇数条边/偶数条边两种情况,这里先讲一下直径为偶数条边的情况,奇数条边同理.

假设当前直径为 $i$,那么我们可以枚举直径的中心点 $p$,也可以看作是我们要枚举的点集的中心点.

我们先让 $p$ 为这颗树的树根.

假设当前枚举的半径的半径为 $j$,那么显然 $p$ 的子树中深度为 $(j-1)$ 的点都是可以随便选的(可选可不选).

令这部分方案数为 $re$,则 $re=2^{dep[j-1]}$ 其中 $dep[i]$ 表示当前根的子树中所有深度小于等于 $i$ 的节点数量.

枚举完可以随便选的部分,再枚举一下深度恰好为 $j$ 的部分:令 $sum[j]$ 表示所有儿子中深度恰好为 $j$ 的数量.

那么我们只需保证在这么多点中选大于等于 $2$ 个点即可.

这个的方案数为 $2^{sum[j]}-1$,然后减掉只有一个的情况,就是 $\sum_{v\in son[p]} 2^{cnt[v][j]}-1$

因为直径可能是奇数,所以将每条边拆成一个点连两条边即可.

#include <bits/stdc++.h>
#define N 4010
#define ll long long
#define mod 998244353
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int edges,now,n;
int hd[N<<1],to[N<<2],nex[N<<2],cnt[N<<1][N],sum[N],bin[N],ans[N];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void dfs(int u,int ff,int d)
{
if(u<=n) ++sum[d], ++cnt[now][d];
for(int i=hd[u];i;i=nex[i]) if(to[i]!=ff) dfs(to[i], u, d+1);
}
int main()
{
// setIO("input");
int i,j;
scanf("%d",&n);
bin[0]=1;
for(i=1;i<=n;++i) bin[i]=bin[i-1]*2%mod;
for(i=1;i<n;++i)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,i+n),add(i+n,u);
add(i+n,v),add(v,i+n);
}
for(i=1;i<=2*n;++i)
{
now=0;
for(j=hd[i];j;j=nex[j]) ++now, dfs(to[j],i,1);
int re=(i<=n);
for(j=1;j<n;++j)
{
int mdl=bin[sum[j]]-1;
for(int k=1;k<=now;++k)
{
(mdl+=mod-bin[cnt[k][j]]+1)%=mod;
}
(ans[j]+=(ll)mdl*bin[re]%mod)%=mod;
re+=sum[j];
}
memset(sum,0,sizeof sum);
for(j=1;j<=now;++j) memset(cnt[j], 0, sizeof cnt[j]);
}
for(i=1;i<n;++i)
printf("%d\n",(ans[i]+mod)%mod);
return 0;
}

  

Comet OJ - Contest #2 (D 错综的光影所迷惑的思念是) 容斥计数的更多相关文章

  1. Comet OJ - Contest #2简要题解

    Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...

  2. Comet OJ - Contest #2题解

    传送门 既然没参加过就没有什么小裙子不小裙子的了-- 顺便全是概率期望真是劲啊-- 因自过去而至的残响起舞 \(k\)增长非常快,大力模拟一下就行了 int main(){ scanf("% ...

  3. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

  4. Comet OJ - Contest #4--前缀和

    原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...

  5. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  6. Comet OJ - Contest #8

    Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...

  7. Comet OJ - Contest #13-C2

    Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...

  8. Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」

    来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...

  9. Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)

    来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...

随机推荐

  1. C++浮点数据的输出控制

    #include <iostream> #include <Windows.h> using namespace std; int main(void) { double va ...

  2. Python开发【第二章】:深浅拷贝剖析

    Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...

  3. SAS学习笔记16 SAS创建计数(枚举)变量

  4. 洛谷 P1540 机器翻译

    链接:https://www.luogu.org/problemnew/show/p1540 题目: 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译 ...

  5. 调用顺丰API实现电商专递下单和获取面单功能

    参考文章:https://www.cnblogs.com/zhangxiaoyong/p/8317229.html 顺丰需求文档: 链接:https://pan.baidu.com/s/16EEaph ...

  6. 图片预加载的插件使用-jquery.imgpreload.min.js

    使用方法: //图片预加载 var the_images = [];//新建一个数组,然后将要加载的图片地址推入这个数组中: the_images.push( 'bg.jpg' ); var load ...

  7. 2.Buffer 缓冲区

    /*缓冲区(Buffer)*/ Buffer 就像一个数组,可以保存多个相同类型的数据.根据数据类型不同(boolean 除外),有以下Buffer常用子类: /*ByteBuffer*/(常用) . ...

  8. CSS3自定义滚动条样式方法

    该代码收集于网上资源,非原创 /*定义滚动条宽高及背景,宽高分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 10px; /*对垂直流动条有效*/ height: ...

  9. OGG 自动重启脚本

    6-20 * * * /oggdata/log/oggautorestart.sh >/oggdata/log/crontab_oggautorestart.log 2>&1 [说 ...

  10. Grassfire算法- 运动规划(Motion planning)

     Grassfire算法: 一.概念 这个算法是做图像处理的抽骨架处理,目的是求出图像的骨架,可以想象一片与物体形状相同的草,沿其外围各点同时点火.当火势向内蔓延,向前推进的火线相遇处各点的轨迹就是中 ...