AtCoder Grand Contest 005F - Many Easy Problems
$n \leq 200000$的树,从树上选$k$个点的一个方案会对$Ans_k$产生大小为“最小的包括这$k$个点的连通块大小”的贡献。求每个$Ans_k$。膜924844033。
看每个点对$Ans_k$的贡献,那就是他在最小$k$连通块里的方案数。画画图可以发现,以他为根时,如果$k$个点都在他同一个儿子的子树里,那就是不包括这个点的,否则就是包括这个点的。“正难♂取反”,所以一个点的贡献就是$\binom{n}{k}-\sum \binom{s(i,j)}{k}$,其中$s(i,j)$表示以$i$为根,子树$j$的大小。这样可以$n^2$。
现在$Ans_k=n\binom{n}{k}-\sum \binom{s(i,j)}{k}$,瓶颈在后面那坨。由于$s(i,j)$的取值只有$0~n$且只有$2(n-1)$个,因此可以dfs一次记$cnt_i=\sum_{s(j,k)=i}1$,有$\sum \binom{s(i,j)}{k}=\sum_{i=1}^n cnt_i\binom{i}{k}$。记$\sum \binom{s(i,j)}{k}=B_k$,因此$k!B_k=\sum_{i=1}^ncnt_i\frac{i!}{(i-k)!}$,棒,一卷积。
924844033原根5。
//#include<iostream>
#include<cstring>
#include<cstdio>
//#include<time.h>
//#include<complex>
#include<algorithm>
#include<stdlib.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=; while ((c=getchar())<'' || c>'');
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s;
} //Pay attention to '-' and LL of qread!!!! int n;
#define maxn 531111
const int mod=,G=; int rev[maxn];
struct Edge{int to,next;}edge[maxn<<]; int first[maxn],le=;
void in(int x,int y) {Edge &e=edge[le]; e.to=y; e.next=first[x]; first[x]=le++;}
void insert(int x,int y) {in(x,y); in(y,x);} int B[maxn],A[maxn],D[maxn],Ans[maxn],cnt[maxn],fac[maxn],inv[maxn];
int C(int n,int m) {return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;} int powmod(int a,int b)
{
int ans=;
while (b) {if (b&) ans=1ll*ans*a%mod; a=1ll*a*a%mod; b>>=;}
return ans;
} void dft(int *a,int n,int type)
{
int wei=; while ((<<wei)!=n) wei++;
for (int i=;i<n;i++)
{
rev[i]=;
for (int j=;j<wei;j++) rev[i]|=((i>>j)&)<<(wei-j-);
}
for (int i=;i<n;i++) if (i<rev[i]) a[i]^=a[rev[i]]^=a[i]^=a[rev[i]];
for (int i=;i<n;i<<=)
{
int t=powmod(G,(mod-)/(i*));
if (type==-) t=powmod(t,mod-);
for (int j=,p=i<<;j<n;j+=p)
{
int tmp=;
for (int k=;k<i;k++,tmp=1ll*tmp*t%mod)
{
int now=1ll*tmp*a[j+k+i]%mod;
a[j+k+i]=(a[j+k]+mod-now)%mod;
a[j+k]=(a[j+k]+now)%mod;
}
}
}
if (type==-)
{
int ni=powmod(n,mod-);
for (int i=;i<n;i++) a[i]=1ll*a[i]*ni%mod;
}
} void mul(int *a,int *b,int *c,int n)
{
dft(a,n,); dft(b,n,);
for (int i=;i<n;i++) c[i]=1ll*a[i]*b[i]%mod;
dft(c,n,-);
} int size[maxn];
void dfs(int x,int fa)
{
size[x]=;
for (int i=first[x];i;i=edge[i].next)
{
Edge &e=edge[i]; if (e.to==fa) continue;
dfs(e.to,x); size[x]+=size[e.to];
cnt[size[e.to]]++; cnt[n-size[e.to]]++;
}
} int main()
{
n=qread();
for (int i=,x,y;i<n;i++) {x=qread(); y=qread(); insert(x,y);}
dfs(,); fac[]=; for (int i=;i<=n;i++) fac[i]=1ll*fac[i-]*i%mod;
inv[n]=powmod(fac[n],mod-); for (int i=n;i;i--) inv[i-]=1ll*inv[i]*i%mod;
for (int i=;i<=n;i++) B[n-i+]=1ll*cnt[i]*fac[i]%mod;
for (int i=;i<=n;i++) A[i]=inv[i];
int mm=; for (;mm<=(n+n);mm<<=);
mul(B,A,D,mm);
for (int i=;i<=n;i++) Ans[i]=1ll*inv[i]*D[n+-i]%mod; for (int i=;i<=n;i++) Ans[i]=(1ll*n*C(n,i)%mod+mod-Ans[i])%mod;
for (int i=;i<=n;i++) printf("%d\n",Ans[i]);
return ;
}
AtCoder Grand Contest 005F - Many Easy Problems的更多相关文章
- AtCoder Grand Contest 005
AtCoder Grand Contest 005 A - STring 翻译 给定一个只包含\(ST\)的字符串,如果出现了连续的\(ST\),就把他删去,然后所有位置前移.问最后剩下的串长. 题解 ...
- AtCoder Grand Contest 006
AtCoder Grand Contest 006 吐槽 这套题要改个名字,叫神仙结论题大赛 A - Prefix and Suffix 翻译 给定两个串,求满足前缀是\(S\),后缀是\(T\),并 ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
- AtCoder Grand Contest 010
AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...
- AtCoder Grand Contest 009
AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...
- AtCoder Grand Contest 008
AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...
- AtCoder Grand Contest 007
AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...
随机推荐
- Python学习日志_2017/09/09
今天早晨学习<Head First HTML and CSS>.随着内容逐渐深入,知识量逐渐增加,今天早晨三个小时学习了一章:<Html的基本元素>,学到了不少的东西.比如,什 ...
- java日期操作的工具类时间格式的转换
package cn.itcast.oa.util; import java.text.ParseException; import java.text.SimpleDateFormat;import ...
- KTU Programming Camp (Winter Training Day 1)
A.B.C(By musashiheart) 0216个人赛前三道题解 E(By ggg) Gym - 100735E Restore H(by pipixia) Gym - 100735H
- 关于img
为img添加属性max-width min-height之类的属性可以对图片溢出部分实行自动裁剪功能 非常方便!!!!!!!!!(仅适用于那些原始图片大于max-width,max-height的图片 ...
- Cscope的使用(领略Vim + Cscope的强大魅力)
文章出处:http://blog.csdn.net/dengxiayehu/article/details/6330200 Cscope的使用(领略Vim + Cscope的强大魅力) 1.Cscop ...
- iOS开发遇到的坑之一: 开发遇见如下错误:Undefined symbols for architecture arm64
博客处女作,写得不好望谅解! “for architecture arm64”就是说没有支持arm64,在Build settings里architecture相关的几项需要配置正确 在最近升级coc ...
- 对于Nginx+PHP实现大文件上传时候需要修改的参数
post_max_size表示POST表单提交的最大大小upload_max_filesize 表示文件上传的最大大小. 通常post_max_size设置的值必须必upload_max_filesi ...
- [学习笔记]一个实例理解Lingo的灵敏性分析
一个实例理解Lingo的灵敏性分析 线性规划问题的三个重要概念: 最优解就是反应取得最优值的决策变量所对应的向量. 最优基就是最优单纯形表的基本变量所对应的系数矩阵如果其行列式是非 ...
- rootfs注册挂载过程分析
参考:Linux Filesystem: 解析 Linux 中的 VFS 文件系统机制 主要代码, init_rootfs(); init_mount_tree(); 1.init_rootfs()解 ...
- 利用Vert.x构建简单的API 服务、分布式服务
目前已经使用Vertx已经一年多了,虽然没有太多的造诣,但也已在项目中推广了下:从最初的vertx搭建web服务,到项目上线运营,还算比较稳定.再到后来尝试搭建基于vertx的分布式服务,一路下来也积 ...