[agc005f]Many Easy Problems
来源:互联网 发布:21端口打开 编辑:程序博客网 时间:2024/06/05 10:52
前言
居然有FFT题。
题目大意
给你一棵树,对于每个k求出在树上任选k个点形成虚树大小的和。
做法
假设这是有根树。
考虑一个点i对于一个k的贡献,考虑容斥。
假设a[i]表示最终答案中
然后答案
这显然可以卷积。
NTT即可。
#include<cstdio>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;typedef long long ll;typedef double db;const int maxn=200000+10,maxlen=maxn*4,mo=924844033,GG=5;int size[maxn],h[maxn],go[maxn*2],nxt[maxn*2];int w[maxlen],a[maxlen],b[maxlen],tt[maxlen],c[maxlen],rev[maxlen],fac[maxn],inv[maxn];int i,j,k,l,t,n,m,tot,len,ans,ni;db ce;void add(int x,int y){ go[++tot]=y; nxt[tot]=h[x]; h[x]=tot;}int qsm(int x,int y){ if (!y) return 1; int t=qsm(x,y/2); t=(ll)t*t%mo; if (y%2) t=(ll)t*x%mo; return t;}void dfs(int x,int y){ a[n]++; int t=h[x]; size[x]=1; while (t){ if (go[t]!=y){ dfs(go[t],x); a[size[go[t]]]--; size[x]+=size[go[t]]; } t=nxt[t]; } a[n-size[x]]--;}void prepare(){ w[0]=1; w[1]=qsm(GG,(mo-1)/len); fo(i,2,len) w[i]=(ll)w[i-1]*w[1]%mo; fo(i,0,len-1){ int p=0; for(int j=0,tp=i;j<ce;j++,tp/=2) p=(p<<1)+(tp%2); rev[i]=p; } ni=qsm(len,mo-2);}void DFT(int *a,int sig){ int i; fo(i,0,len-1) tt[rev[i]]=a[i]; for(int m=2;m<=len;m*=2){ int half=m/2,bei=len/m; fo(i,0,half-1){ int wi=sig>0?w[i*bei]:w[len-i*bei]; for(int j=i;j<len;j+=m){ int u=tt[j],v=(ll)tt[j+half]*wi%mo; tt[j]=(u+v)%mo; tt[j+half]=(u-v)%mo; } } } if (sig==-1) fo(i,0,len-1) tt[i]=(ll)tt[i]*ni%mo; fo(i,0,len-1) a[i]=tt[i];}void NTT(){ DFT(a,1);DFT(b,1); fo(i,0,len-1) a[i]=(ll)a[i]*b[i]%mo; DFT(a,-1); fo(i,0,len-1) c[i]=a[i];}int main(){ scanf("%d",&n); fo(i,1,n-1){ scanf("%d%d",&j,&k); add(j,k);add(k,j); } dfs(1,0); fac[0]=1; fo(i,1,n) fac[i]=(ll)fac[i-1]*i%mo; inv[n]=qsm(fac[n],mo-2); fd(i,n-1,0) inv[i]=(ll)inv[i+1]*(i+1)%mo; fo(i,0,n) a[i]=(ll)a[i]*fac[i]%mo; fo(i,0,n) b[i]=inv[i]; reverse(b,b+n+1); len=1; while (len<=2*n) len*=2; ce=log(len)/log(2); prepare(); NTT(); fo(i,1,n){ ans=(ll)inv[i]*c[n+i]%mo; (ans+=mo)%=mo; printf("%d\n",ans); }}
阅读全文
0 0
- [agc005f]Many Easy Problems
- [FFT] Atcoder AGC005F. Many Easy Problems
- 【AGC005F】Many Easy Problems FFT 容斥原理
- [AGC005F]Many Easy Problems-FFT-容斥原理
- Easy-caught problems
- PAT Advanced Level (1) Easy Problems
- 解决客户impdp 导数据问题(many problems solved)
- Problems
- Problems
- Problems
- [math][第二阶段-easy math][HDU-2138]How many prime numbers
- MySQL's Strict Mode fixes many data integrity problems in MySQL
- The 7th Southwest Jiao Tong University Programming Contest——Problems Easy-Summary
- easy
- Easy
- Debug problems
- hibernate problems
- Ubuntu problems
- 貌似Keep登录首页 图片在背景移动
- Matlab起名小软件 再也不用担心給亲戚朋友取名字啦
- 荐号 | 11个人工智能与大数据相关的个人、企业优质号
- github上面如何编辑README
- JAVA_编程小案例_打印2+22+222+...
- [agc005f]Many Easy Problems
- 关于Web容器,servlet容器和web应用的关系
- android中 禁止竖屏,且横屏可以旋转
- 实验四
- 记录一下老记不住的代码(1):getView()方法
- 主线程与子线程互相通信
- MySQL的JDBC连接
- mac配置tesseract-ocr
- 判断外置存储