Description

One day, Takahashi was given the following problem from Aoki:

You are given a tree with N vertices and an integer K. The vertices are numbered 1 through N. The edges are represented by pairs of integers (ai,bi).

For a set S of vertices in the tree, let f(S) be the minimum number of the vertices in a subtree of the given tree that contains all vertices in S.

There are C(n,k) ways to choose K vertices from the trees. For each of them, let S be the set of the chosen vertices, and find the sum of f(S) over all C(n,k) ways.

Since the answer may be extremely large, print it modulo 924844033(prime).

Since it was too easy for him, he decided to solve this problem for all K=1,2...N.

2≤N≤200000,1≤ai,bi≤N.The given graph is a tree.

Input

The input is given from Standard Input in the following format:
N
a1 b1
a2 b2
...
aN-1 bN-1

Output

Print N lines. The i-th line should contain the answer to the problem where K=i, modulo 924844033.

 

题意:给定一棵 $n$ 个节点的树,选出 $k$ 个特殊点,假设点集为 $S$,令 $f(S)$ 为最小的包含这 $k$ 个节点的连通块,分别求出 $k=1...n$ 在所有情况下的 $f(S)$ 的和。

分析:

考虑暴力,一个点被统计在连通块内,即在以它为根时,选出来的 $k$ 个点都在它的同一个儿子的子树内。即节点 $x$ 被统计进答案的次数 $g(x)$ 为:

$$g(x)=\binom{n}{k}-\sum _{(x,i)\subseteq E}\binom{sz_{i}}{k}$$

令 $cnt_{x}$ 表示上述公式里有多少个 $sz_{i}=x$,那么可以得到:

$$ans_{k}=\sum _{i=1}^{n}cnt_{i}\cdot\binom{i}{k}$$

整理可得:

$$k!\cdot ans_{k}=\sum _{i=1}^{n}\frac{cnt_{i}\cdot i!}{(i-k)!}$$

令 $a_{i}=cnt_{i}\cdot i!$,$b_{i}=(n-i)!$,则可得:

$$k!\cdot ans_{k}=\sum _{i=1}^{n}a_{i}\cdot b_{n-i+k}$$

最终答案为 $n\cdot \binom{n}{k}-ans_{k}$ 。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int N=2e5+;
const int M=+;
const int mod=;
int n,nn,cnt,u,v,ans,first[N],fac[N],inv[N];
int num[N],sz[N],a[M],b[M];
struct edge{int to,next;}e[N*];
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
void ins(int u,int v){e[++cnt]=(edge){v,first[u]};first[u]=cnt;}
void dfs(int x,int fa)
{
sz[x]=;
for(int i=first[x];i;i=e[i].next)
{
int to=e[i].to;
if(to==fa)continue;
dfs(to,x);
sz[x]+=sz[to];
}
if(fa!=-)a[sz[x]]++,a[n-sz[x]]++;
}
int power(int a,int b)
{
int ans=;
while(b)
{
if(b&)ans=1ll*ans*a%mod;
a=1ll*a*a%mod;b>>=;
}
return ans;
}
void ntt(int *a,int n,int f)
{
int k=;while((<<k)<n)k++;
for(int i=;i<n;i++)
{
int t=;
for(int j=;j<k;j++)
if(i&(<<j))t|=(<<(k-j-));
if(i<t)swap(a[i],a[t]);
}
for(int l=;l<=n;l<<=)
{
int m=l>>,nw=power(,(mod-)/l);
if(f==-)nw=power(nw,mod-);
for(int *p=a;p!=a+n;p+=l)
{
int w=;
for(int i=;i<m;i++)
{
int t=1ll*p[m+i]*w%mod;
p[m+i]=(p[i]-t+mod)%mod;
p[i]=(p[i]+t)%mod;
w=1ll*w*nw%mod;
}
}
}
if(f==-)
{
int inv=power(n,mod-);
for(int i=;i<n;i++)a[i]=1ll*a[i]*inv%mod;
}
}
int main()
{
n=read();
for(int i=;i<n;i++)
{
u=read();v=read();
ins(u,v);ins(v,u);
}
dfs(,-);
fac[]=;
for(int i=;i<=n;i++)fac[i]=1ll*fac[i-]*i%mod;
inv[n]=power(fac[n],mod-);
for(int i=n;i>=;i--)inv[i-]=1ll*inv[i]*i%mod;
for(int i=;i<=n;i++)a[i]=1ll*a[i]*fac[i]%mod;
for(int i=;i<=n;i++)b[n-i]=inv[i];
nn=;while(nn<n+n+)nn<<=;
ntt(a,nn,);ntt(b,nn,);
for(int i=;i<nn;i++)a[i]=1ll*a[i]*b[i]%mod;
ntt(a,nn,-);
for(int i=;i<=n;i++)
{
ans=1ll*fac[n]*inv[i]%mod*inv[n-i]%mod*n%mod;
printf("%lld\n",(ans-1ll*a[n+i]*inv[i]%mod+mod)%mod);
}
return ;
}

【AGC 005F】Many Easy Problems的更多相关文章

  1. 【AGC005 F】Many Easy Problems

    神他吗一天考一道码农题两道 FFT(其实还是我推式子一窍不通) 题意 给你一棵 \(n\) 个点的树,再给你一个常数 \(k\). 设 \(S\) 为树上某些点的集合,定义 \(f(S)\) 为最小的 ...

  2. 【期望DP】BZOJ3450- Tyvj1952 Easy

    ---恢复内容开始--- [题目大意] 有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有a*a分,comb就是极大的连续o.求期望分数. [思路] 比之前的OS ...

  3. 【Hello 2018 D】Too Easy Problems

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 可以考虑把所有的题目按照ai排序. 然后顺序考虑最后做出来的题目个数和第i道题目的ai一样. 则1..i-1这些题目就没有用了. 值 ...

  4. 【AGC005F】Many Easy Problems FFT 容斥原理

    题目大意 给你一棵树,有\(n\)个点.还给你了一个整数\(k\). 设\(S\)为树上某些点的集合,定义\(f(S)\)为最小的包含\(S\)的联通子图的大小. \(n\)个点选\(k\)个点一共有 ...

  5. 【AGC005F】Many Easy Problems (NTT)

    Description ​ 给你一棵\(~n~\)个点的树和一个整数\(~k~\).设为\(~S~\)为树上某些点的集合,定义\(~f(S)~\)为最小的包含\(~S~\)的联通子图的大小.\(~n~ ...

  6. 【AGC005F】Many Easy Problems

    Description 题目链接 对于每个\(k\),统计任选\(k\)个点作为关键点的"最小生成树"的大小之和 Solution 正向想法是枚举或者计算大小为\(x\).叶子数目 ...

  7. 【POJ 2826】An Easy Problem?!(几何、线段)

    两个木条装雨水能装多少. 两线段相交,且不遮盖的情况下才可能装到水. 求出交点,再取两线段的较高端点的较小值h,(h-交点的y)为三角形的高. 三角形的宽即为(h带入两条线段所在直线得到的横坐标的差值 ...

  8. 【AGC 002F】Leftmost Ball

    Description Snuke loves colorful balls. He has a total of N*K balls, K in each of his favorite N col ...

  9. 【hdu6334】【2018Multi-University-Training Contest04】Problem C. Problems on a Tree

    维护1边的联通块和2边的联通块,合并的时候直接启发式合并. cdqz的大爷好强啊. #include<bits/stdc++.h> #define lson (o<<1) #d ...

随机推荐

  1. SQL高级查询基础

    1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. ...

  2. requests库下载图片的方法

    方法: 传入图片url,requests.get()方法请求一下,将源码以二进制的形式写在本地即可. 以前一直以为requests库中有特定的方法获取图片,类似urllib.request.urlre ...

  3. [FTP]通过FileZilla在阿里云主机上搭建ftp服务器

    前一阵子租了一台服务器主机来玩,正好周末有时间研究了一下怎么搭建ftp server. 准备.首先要下载filezilla client和filezilla server, 下载地址: server: ...

  4. 安装mysql8.0.12

    安装mysql8.0.12 https://blog.csdn.net/zwj1030711290/article/details/80039780 问题1:忘记记录日志打印的密码就把窗口给关了 解决 ...

  5. python学习——读取染色体长度(二、向前一步:通过染色体序列获得长度信息)

    # 读取fasta # 解析每条序列的长度 chr1_seq = 'ATATATATAT' chr2_seq = 'ATATATATATCGCGCGCGCG' chr3_seq = 'ATATATAT ...

  6. ansible_playbook 一键搭建集群架构

    目录 基础优化 SSH.Ansible,批量管理服务项目 剧本开始-----.10分钟左右 mail.yaml base.yaml rsync.yaml nfs.yaml web.yaml tweb. ...

  7. ztree 为节点添加点击触发事件

    <SCRIPT type="text/javascript"> var setting = { data : { key : { title : "code& ...

  8. SpringBoot通过RedisTemplate执行Lua脚本

    如果你对Redis和Lua的关系不太清楚,请先阅读:Redis进阶之使用Lua脚本开发 1.RedisScript 首先你得引入spring-boot-starter-data-redis依赖,其次把 ...

  9. windows安全更新程序(KB4093112) 安装失败 错误0x80070011

    解决办法:win + R → 输入regedi 将默认安装路径改回C盘的program files

  10. [转帖]windows10,business版和consumer版本区别

    windows10,business版和consumer版本区别 时间:2018-07-08 10:50来源:原创 作者:5分享 点击: 7113 次 windows10系统(1803)busines ...