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 ...
随机推荐
- 强化学习_PolicyGradient(策略梯度)_代码解析
使用策略梯度解决离散action space问题. 一.导入包,定义hyper parameter import gym import tensorflow as tf import numpy as ...
- Vue项目经验
Vue项目经验 setInterval路由跳转继续运行并没有及时进行销毁比如一些弹幕,走马灯文字,这类需要定时调用的,路由跳转之后,因为组件已经销毁了,但是setInterval还没有销毁,还在继续后 ...
- python基础一 day9 函数升阶(3)
局部命名空间一般之间是独立,局部命名空间是调用函数时生成的函数的名字指向它所在的地址局部不会对全局产生影响,除非加global.# def max(a,b):# return a if a>b ...
- tcpdump简单使用
1.使用wincap将文件放入系统任意路径, 2.进入系统,赋文件可执行权限, 3.输入命令:./tcpdump -i eth0 -s 0 -w xxx.pcap 4.进行数据交互 5.退出程序运行, ...
- Encryption-基础:base64加解密
环境:vc2003 .h /********** This library is free software; you can redistribute it and/or modify it und ...
- css--背景和列表
背景 背景样式: background-color 设置元素的背景颜色 background-image 把图像设置为背景 background-repeat 设置背景图像是否重复及如 ...
- js解析json格式
function save(){ var value2 = { "china":[ {"name":"hangzhou", "it ...
- viewDidLoad、loadView
一.loadView永远不要主动调用这个函数.view controller会在view的property被请求并且当前view值为nil时调用这个函数.如果你手动创建view,你应该重载这个函数,且 ...
- ZOJ Monthly, January 2019-Little Sub and Pascal's Triangle
这个题的话,它每行奇数的个数等于该行行号,如果是0开始的,就该数的二进制中的1的个数,设为k,以它作为次数,2k就是了. #include <stdio.h> int main() { i ...
- 【单调栈 动态规划】bzoj1057: [ZJOI2007]棋盘制作
好像还有个名字叫做“极大化”? Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的黑白相间的 ...