[AGC005F] Many Easy Problems
题意简述
给定一颗无根树,对于所有大小为 $i$ 的点集,求出能够包含它的所有联通块之和,定义为 $f_i$ ,答案对 $924844033$ 取模。
$n\leq 2\times 10^5$ 。
$solution:$
考虑每个点在点集中起到的贡献,可以得到
$$f_i=n\times\dbinom{n}{k}-\sum_{i=1}^n \dbinom{n-size_i}{k}+\sum_{x\in i} \dbinom{size_x}{k}\\=n\times \dbinom{n}{k}-\sum_{i=k}^n cnt_i\dbinom{i}{k}\\=n\times \dbinom{n}{k}-\dfrac{1}{k}\sum_{i=k}^n \dfrac{i!}{(i-k)}$$
设 $a_i=cnt_i\times i!,b_i=(n-i)!$ 。
则
$$f_i=n\times \dbinom{n}{k}-\sum_{i=k}^n a_i\times b_{n-i+k}$$
直接 $NTT$ 即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define int long long
#define mod 924844033
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
int n,inv[MAXN],head[MAXN],fac[MAXN],infac[MAXN],Cnt,cnt[MAXN],siz[MAXN];
int C(int n,int m){return (((fac[n]*infac[m])%mod)*infac[n-m])%mod;}
struct node{
int u,v,nex;
}x[MAXN<<];
void add(int u,int v){
x[Cnt].u=u,x[Cnt].v=v,x[Cnt].nex=head[u],head[u]=Cnt++;
}
int ksm(int a,int b){
int ans=;
while(b){
if(b&) ans*=a,ans%=mod;
a*=a,a%=mod;
b>>=;
}return ans;
}
void dfs(int u,int fath){
siz[u]=;
for(int i=head[u];i!=-;i=x[i].nex){
if(x[i].v==fath) continue;
dfs(x[i].v,u);
siz[u]+=siz[x[i].v];
cnt[siz[x[i].v]]++;
}
cnt[n-siz[u]]++;
return;
}
int N,M,flip[MAXN],f[MAXN],g[MAXN];
void NTT(int *f,int opt){
for(int i=;i<N;i++) if(i<flip[i]) swap(f[i],f[flip[i]]);
for(int p=;p<=N;p<<=){
int len=p>>,buf=ksm(,(mod-)/p);
if(opt==-) buf=ksm(buf,mod-);
for(int be=;be<N;be+=p){
int tmp=;
for(int l=be;l<be+len;l++){
int t=f[l+len]*tmp;t%=mod;
f[l+len]=(f[l]-t+mod)%mod,f[l]=(f[l]+t)%mod;
tmp*=buf,tmp%=mod;
}
}
}
if(opt==-){
int inv=ksm(N,mod-);
for(int i=;i<N;i++) f[i]*=inv,f[i]%=mod;
}return;
}
signed main(){
// freopen("6.in","r",stdin);
memset(head,-,sizeof(head));
inv[]=;for(int i=;i<=;i++) inv[i]=((mod-mod/i)*inv[mod%i])%mod;
fac[]=;for(int i=;i<=;i++) fac[i]=(fac[i-]*i)%mod;
infac[]=;for(int i=;i<=;i++) infac[i]=(infac[i-]*inv[i])%mod;
n=read();
for(int i=;i<n;i++){
int u=read(),v=read();
add(u,v),add(v,u);
}
dfs(,);
N=n,M=n;
for(int i=;i<=N;i++) f[i]=(cnt[i]*fac[i])%mod;
for(int i=;i<=M;i++) g[i]=infac[n-i];
M+=N;
for(N=;N<=M;N<<=);
for(int i=;i<N;i++) flip[i]=((flip[i>>]>>)|(i&?N>>:));
NTT(f,),NTT(g,);
for(int i=;i<N;i++) f[i]*=g[i],f[i]%=mod;
NTT(f,-);
for(int i=;i<=n;i++){
int a=(n*C(n,i))%mod,b=(infac[i]*f[n+i])%mod;
printf("%lld\n",(((a-b)%mod)+mod)%mod);
}return ;
}
[AGC005F] Many Easy Problems的更多相关文章
- AGC005F Many Easy Problems(NTT)
先只考虑求某个f(k).考虑转换为计算每条边的贡献,也即该边被所选连通块包含的方案数.再考虑转换为计算每条边不被包含的方案数.这仅当所选点都在该边的同一侧.于是可得f(k)=C(n,k)+ΣC(n,k ...
- 【AtCoder】AGC005F - Many Easy Problems
题解 我们把一个点的贡献转化为一条边的贡献,因为边的数量是点的数量-1,最后再加上选点方案数\(\binom{n}{k}\)即可 一条边的贡献是\(\binom{n}{k} - \binom{a}{k ...
- 解题:AT2064 Many Easy Problems&EXNR #1 T3 两开花
题面 两道题比较像,放在一起写了,后者可以看成前者的加强版 (sto ztb orz) 先看AT那道题 考虑计算每个点的贡献,用容斥计算:每个点没有贡献当且仅当选的所有点都在以他为根时的一个子节点的子 ...
- Codeforces 913D - Too Easy Problems
913D - Too Easy Problems 思路:二分check k 代码: #include<bits/stdc++.h> using namespace std; #define ...
- 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT
[题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...
- 【CodeForces】913 D. Too Easy Problems
[题目]D. Too Easy Problems [题意]给定n个问题和总时限T,每个问题给定时间ti和限制ai,当解决的问题数k<=ai时问题有效,求在时限T内选择一些问题解决的最大有效问题数 ...
- AtcoderGrandContest 005 F. Many Easy Problems
$ >AtcoderGrandContest \space 005 F. Many Easy Problems<$ 题目大意 : 有一棵大小为 \(n\) 的树,对于每一个 \(k \i ...
- 【AGC005F】Many Easy Problems (NTT)
Description 给你一棵\(~n~\)个点的树和一个整数\(~k~\).设为\(~S~\)为树上某些点的集合,定义\(~f(S)~\)为最小的包含\(~S~\)的联通子图的大小.\(~n~ ...
- 【AGC005F】Many Easy Problems FFT 容斥原理
题目大意 给你一棵树,有\(n\)个点.还给你了一个整数\(k\). 设\(S\)为树上某些点的集合,定义\(f(S)\)为最小的包含\(S\)的联通子图的大小. \(n\)个点选\(k\)个点一共有 ...
随机推荐
- 【LuoguP4916】魔力环
题目链接 题意 求出 \(n\) 个珠子的在旋转同构意义下的手 环 个数,满足以下条件: 恰好有 \(m\) 个黑色珠子,其余为白色. 黑色珠子形成的最长连续段不能超过 \(k\) 个. Sol 考虑 ...
- 利用雅虎ycsb对cassandra做性能测试
准备: 环境: 两台虚拟机:ip:192.168.138.128/129;配置:2核4G: 版本:apache-cassandra-3.10 ycsb-cassandra-binding-0.1 ...
- eclips 中的 svn 更新报错,被锁住解决办法
svn更新不下来,在文件的目录上选择 Team,然后选择 Refresh/Cleanup ,然后就可以了,这个方法我自己试有效,做为参考,对其它情况不一定有效 报错如下 解决方法
- 快速掌握Eclipse Plugin / RCP开发思想
本文转载:https://my.oschina.net/drjones/blog/280337 引言 本文不是快速入门的文章,只面向有一定基础的开发人员,至少看这篇文章之前你应该了解什么是Eclips ...
- [window] Pyhton轻便好用的spyder IDE如何去除E501 line too long提示
spyder 使用pep8作为代码规范的标准,默认单行长度是89个字符以内. 作为一个完美控,在使用spyer有的进行coding时,每当看到以下这个小小的warning时,心情都不是很爽: 89个字 ...
- idea导入eclipse云笔记cloud_note项目 成功运行
Tomcat 运行 Success
- STM32内部时钟设置-寄存器版
STM32寄存器版本——内部时钟设置 同时要记得把延时初始化函数设置好 //系统时钟初始化函数 //pll:选择的倍频数,从2开始,最大值为16 //pll:选择的倍频数,这里使用内部时钟,PLL为4 ...
- 浙大PAT CCCC L3-015 球队“食物链” ( 搜索 && 剪枝 )
题目链接 题意 : 有 n 个球队,给出主客场胜负图,找出一个序列 1.2.3..... 使得 1 战胜过 2 .2 战胜过 3.3 战胜过 4..... n 战胜过 1 ( 这个序列是 1~n 的其 ...
- matplotlib中中文字体配置
解决方式1:利用matplotlib的字体管理工具font_manager---->缺点:每次必须要进行设置 import matplotlib.pyplot as plt from matpl ...
- 爬虫小例1:ajax形式的网页数据的抓取
---恢复内容开始--- 下面记录如何抓取ajax形式加载的网页数据: 目标:获取“https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%8 ...