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 ...
随机推荐
- poj2312Battle City BFS
题意: M行N列矩阵, 'Y'表示开始位置, 'T'表示目标位置, 从开始位置到目标位置至少需要走多少步,其中, 'S', 'R'表示不能走, 'B' 花费为2, 'E'花费为1. 思路:纯 BFS. ...
- 用vscode开发vue应用[转]
https://segmentfault.com/a/1190000019055976 现在用VSCode开发Vue.js应用几乎已经是前端的标配了,但很多时候我们看到的代码混乱不堪,作为一个前端工程 ...
- 官方webupload上传多个文件或者图片的方法
文件上传 页面代码: <!--引入CSS--> <link rel="stylesheet" type="text/css" href=&qu ...
- swift中使用sqlite3
import Foundation /** 1. 打开数据库 2. 如果没有数据表,需要首先创表 3. 数据操作 */ class SQLite { var db: COpaquePointer = ...
- GIMP永久保存选择的办法
选择选区,然后把选区放到channel里面去 这是一张已经选择好的选区的图片 然后选择select下的Save to Channel, 需要这部分选区的话,只需要点击这个按钮就可以了
- Python编程快速上手--实践项目11.11.1
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time def messa ...
- Verilog学习笔记基本语法篇(六)········ 循环语句
在Verilog中存在着4种类型的循环语句,用来控制执行语句的执行次数. 1)forever语句: 连续执行的语句. 2)repeat语句: 连续执行n次的语句. 3)while语句: 执行语 ...
- 快速入门Matplotlib
十分钟快速入门Matplotlib 函数式绘图 这个库主要有两种绘图方式,一种是像这样的类matlab的函数式绘图方法. import matplotlib.pyplot as plt import ...
- ORACLE 检索某列包含特定字符串的数据表工具存储过程
使用示例: delete APPS.FIND_RESULT; set serveroutput ondeclare v_ret varchar(200);begin apps.sp_f ...
- MySQL外键设置 级联删除
. cascade方式在父表上update/delete记录时,同步update/delete掉子表的匹配记录 . set null方式在父表上update/delete记录时,将子表上匹配记录的列设 ...