[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\)个点一共有 ...
随机推荐
- 用vue构建项目同一局域网下通过ip访问
在webpack配置文件下改为 host:'0.0.0.0' 改为后启动跳转不到登录页面 需手动修改浏览器上的0.0.0.0:8080为自己ip加上:8080 就可以在别的电脑上进行访问了 举一反三: ...
- React Native 之导航栏
一定要参考官网: https://reactnavigation.org/docs/en/getting-started.html 代码来自慕课网:https://www.imooc.com/cour ...
- mybatis学习$与#号取值区别
1,多个参数传递用map或实体封装后再传给myBatis, mybatis学习$与#号取值区别 #{} 1.加了单引号, 2.#号写是可以防止sql注入,比较安全 select * from use ...
- window7下docker toolbox 启用数据卷报错: Error response from daemon: invalid mode:
场景:希望把d:\dockerShare文件夹作为数据卷 ,和docker中的centos镜像生成的容器关联. 原来的命令: docker run -d -it --name=edc-centos7 ...
- JDK,JRE与JVM浅析
JAVA的两个特性: 1, 开源-指的是源代码免费 2,跨平台(可移植性好) 跨平台:是指跨操作系统 JVM(java virtual machine,java虚拟机) JVM就像是两国谈判时的使者充 ...
- Java——容器(泛型)
[泛型] 起因:JDK1.4之前类型不明确 <1>装入集合的类型都被当做Object对待,从而失去自己的实际类型. <2>从集合中取出时往往需要转型,效率低,且很容易出错 ...
- vue-cli3取消eslint
遇到这样的空白报错问题,删除这行代码就行
- #20175201张驰 实验三 敏捷开发与XP实践
实验步骤 (一)敏捷开发与XP 一.敏捷开发与XP实践-1 ①实验要求: 敏捷开发与XP实践 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse ...
- MDX 入门
之前用到的SQL,解释:结构化查询语言(Structured Query Language)(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种 ...
- debian 配置静态ip
1. 查看虚拟机上本机ipcmd→ipconfig 2. 配置网卡2.1 备份原有配置文件配置文件cp /etc/network/interfaces /etc/network/interfacesb ...