当前位置: 首页 > news >正文

莱芜在线人才网关键词排名优化工具有用吗

莱芜在线人才网,关键词排名优化工具有用吗,上饶做网站,长春疫情轨迹最新通报WC2019 T1 数树 传送门(https://loj.ac/problem/2983) Question 0 对于给定的两棵树,设记两颗树 \(A,B\) 的重边数量为 \(R(A,B)\),那么\[ Ansy^{n-R(A,B)} \] Question 1 给定其中一棵树,求第二棵树的所有情况下答案的…

WC2019 T1 数树

传送门(https://loj.ac/problem/2983)

Question 0

对于给定的两棵树,设记两颗树 \(A,B\) 的重边数量为 \(R(A,B)\),那么
\[ Ans=y^{n-R(A,B)} \]

Question 1

给定其中一棵树,求第二棵树的所有情况下答案的总和

不妨令 \(y=y^{-1}\) ,最终答案就是 \(y^{-n}y^{R(A,B)}\)

在给定 \(A\) 的情况下,只需要统计 \(\sum\limits_B y^{R(A,B)}\) 即可

注意到\(y^k=[(y-1)+1]^k=\sum\limits_{i=0}^k (y-1)^i \binom{k}{i}\)

及对于确定的 \(A,B\),枚举一个边集 \(S\) ,若 \(S\) 中每一条边均为 \(A,B\) 重边,则其贡献为 \((y-1)^{|S|}\) 否则为 \(0\)

特别的,我们把 \(y-1=0​\) 特判掉,因为不存在逆元。

考虑枚举每一个 \(A​\) 的边集,假设一共 \(n-m​\) 条边把 \(n​\) 个点划分成了 \(m​\) 个联通块。

设第 \(i​\) 个联通块有 \(a_i​\) 个点那么它的贡献为 \((y-1)^{n-m}\times​\) 包含这\(n-m​\) 条边的树的个数。

把每一个联通块当作一个点,考虑枚举每个联通块的度数 \(d_i\) 通过 \(prufer\) 序列我们知道答案为
\[ Ans=(y-1)^{n-m}\sum\limits_{(\sum a_i)=n,(\sum d_i)=2(m-2)} m^{m-2}(\prod_{i=1}^m a_i^{d_i})(\prod_{i=1}^m \binom{\sum_{j=1}^i(d_j-1)}{d_i-1}) \\ =(y-1)^{n-m}\sum\limits_{(\sum a_i)=n,(\sum d_i)=2m-2} m^{m-2}(\prod_{i=1}^m a_i^{d_i})\frac{(m-2)!}{\prod_{i=1}^m(d_i-1)!}\\ =(y-1)^{n-m}\sum\limits_{(\sum a_i)=n,(\sum d_i)=m-2} (\prod_{i=1}^m a_i)(m-2)!m^{m-2}\prod_{i=1}^m \frac{a_i^{d_i}}{d_i!}\\ =(y-1)^{n-m}\sum\limits_{(\sum a_i)=n} (\prod_{i=1}^m a_i)n^{m-2}\\ =(y-1)^n n^{-2}\sum\limits_{(\sum a_i)=n} (\prod_{i=1}^m a_i)n^m (y-1)^{-m}\\ =(y-1)^n n^{-2}\sum\limits_{(\sum a_i)=n} (\prod_{i=1}^m a_i(y-1)^{-1}n)\\ \]
注意 \((\prod_{i=1}^m a_i)\) 表示每个联通块中选一个关键点的方案数量,这样就可以设 \(F_{x,0/1}\) 表示 \(x\) 号点所在联通块是否选出关键点的贡献和,树形 \(DP\) ,每次考虑父子的边是否被选中即可。

Question 2

\(Question\ 1​\) 的做法类似,先特判 $y-1=​$0 考虑枚举一个边集构成了 $ m ​$ 个的联通块的答案
\[ Ans=(y-1)^{n-m}\sum\limits_{(\sum a_i)=n}\frac{n!}{\prod_{i=1}^m a_i!}\prod a_i^{a_i-2}\frac {1}{m!}(n^{m-2}\prod_{i=1}^m a_i)^2\\ =(y-1)^n n^{-4} n!\sum\limits_{(\sum a_i)=n}\frac {1}{m!}{\prod_{i=1}^m \frac{n^2 a_i^{a_i}}{a_i!(y-1)}}\\ \]
之需要考虑 \(F_n=\sum\limits_{(\sum a_i)=n}\frac {1}{m!}{\prod_{i=1}^m \frac{n^2 a_i^{a_i}}{a_i!(y-1)}}​\) 的结果即可。

若设大小为 $k $ 的部分的贡献为 \(G(k)=\frac{n^2 k^k}{k! (y-1)}\),考虑 \(e^x\)\(exp(x)\) 的泰勒展开式为 \(\sum_{i=0}^{+INF} \frac{x^i}{i!}\)

\(F=exp(G)\) ,那么多项式求 \(exp\) 即可。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
int read(){int nm=0,fh=1; char cw=getchar();for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');return nm*fh;
}
#define pii pair<int,int>
#define mp make_pair
#define mod 998244353
#define M 600010
namespace  CALC{inline int add(int x,int y){x+=y;return (x>=mod)?(x-mod):x;}inline int mns(int x,int y){x-=y;return (x<0)?(x+mod):x;}inline int mul(LL x,LL y){return (LL)x*(LL)y%mod;}inline void upd(int &x,int y){x+=y;(x>=mod)?(x-=mod):0;}inline int qpow(int x,int sq){int res=1;for(;sq;sq>>=1,x=mul(x,x)) if(sq&1) res=mul(res,x);return res;}
}using namespace CALC;
namespace POLY{int lg[M],g[40],v[40],od[M],iv[40],vv[M];void init(int N){N<<=2; int len=2,nw=1;for(;len<=N;len<<=1,nw++)lg[len]=nw,v[nw]=qpow(g[nw]=qpow(3,(mod-1)/len),mod-2),iv[nw]=qpow(len,mod-2);for(int i=1;i<=len;i++) vv[i]=qpow(i,mod-2);vv[0]=0;}void NTT(int *x,int len,int kd){int bas=lg[len];for(int i=1;i<len;i++) od[i]=(od[i>>1]>>1)|((i&1)<<(bas-1));for(int i=1;i<len;i++) if(i<od[i]) swap(x[i],x[od[i]]);for(int tt=1,tp=1;tt<len;tp++,tt<<=1){for(int wn=(kd>0)?g[tp]:v[tp],st=0;st<len;st+=(tt<<1)){for(int now=1,pos=st;pos<st+tt;pos++,now=mul(now,wn)){int t1=x[pos],t2=mul(now,x[pos+tt]);x[pos]=add(t1,t2),x[pos+tt]=mns(t1,t2);}}} if(kd>0) return;for(int i=0;i<len;i++) x[i]=mul(x[i],iv[bas]);}inline void cpy(int *_dt,int *_ss,int len){memcpy(_dt,_ss,sizeof(int)*len);}void get_inv(int *F,int *G,int len){static int A[M],B[M];if(len==1){G[0]=qpow(F[0],mod-2);return;} get_inv(F,G,len>>1);cpy(A,F,len),cpy(B,G,len),len<<=1,NTT(A,len,1),NTT(B,len,1);for(int i=0;i<len;i++) G[i]=mns(add(B[i],B[i]),mul(mul(B[i],B[i]),A[i]));for(int i=0;i<len;i++) A[i]=B[i]=0; NTT(G,len,-1),len>>=1;for(int i=len;i<len+len;i++) G[i]=0;}inline void qd(int *F,int len){for(int i=1;i<len;i++) F[i-1]=mul(F[i],i); F[len-1]=0;}inline void jf(int *F,int len){for(int i=len-1;i;i--) F[i]=mul(F[i-1],vv[i]); F[0]=0;}void get_ln(int *F,int *G,int len){static int A[M],B[M];get_inv(F,A,len),cpy(B,F,len),qd(B,len),len<<=1;NTT(A,len,1),NTT(B,len,1);for(int i=0;i<len;i++) G[i]=mul(A[i],B[i]),A[i]=B[i]=0;NTT(G,len,-1),jf(G,len),len>>=1;for(int i=len;i<(len<<1);i++) G[i]=0;}void get_exp(int *F,int *G,int len){static int A[M],B[M];if(len==1){G[0]=1;return;} get_exp(F,G,len>>1);cpy(A,G,len),get_ln(G,B,len);for(int i=0;i<len;i++) B[i]=mns(F[i],B[i]);len<<=1,NTT(A,len,1),NTT(B,len,1);for(int i=0;i<len;i++) G[i]=mul(A[i],B[i]),A[i]=B[i]=0;NTT(G,len,-1),len>>=1;for(int i=len;i<len+len;i++) G[i]=0;}
}
int n,Y,op,ans,nts;
map<pii,bool> P;
namespace Q1{int fs[M],nt[M],to[M],tmp,F[M][2],K,vK,G[2];inline void link(int x,int y){nt[tmp]=fs[x],fs[x]=tmp,to[tmp++]=y;}inline void DP(int x,int last){F[x][0]=F[x][1]=K;for(int i=fs[x],v;i!=-1;i=nt[i]) if((v=to[i])^last){DP(to[i],x),G[0]=0,G[1]=0;for(int j=0;j<2;j++) for(int k=0;k<2;k++){if(!(j&k)) upd(G[j|k],mul(mul(F[x][j],F[v][k]),vK));if(k) upd(G[j],mul(F[x][j],F[v][k]));} F[x][0]=G[0],F[x][1]=G[1];}}inline int solve(){memset(fs,-1,sizeof(fs));for(int i=1,x,y;i<n;i++) x=read(),y=read(),link(x,y),link(y,x);if(Y==1) return qpow(n,n-2); K=mul(qpow(Y-1,mod-2),n),vK=qpow(K,mod-2),DP(1,0);return mul(mul(F[1][1],nts),mul(qpow(mul(n,n),mod-2),qpow(Y-1,n)));}
}
namespace Q2{int F[M],G[M];inline int solve(){if(Y==1) return qpow(n,n+n-4); int len=1,fc=1; POLY::init(n),F[0]=1;for(int i=1;i<=n;i++)F[i]=mul(mul(mul(n,n),mul(qpow(i,i),qpow(fc=mul(fc,i),mod-2))),qpow(Y-1,mod-2));while(len<=n) len<<=1; POLY::get_exp(F,G,len);return mul(mul(mul(G[n],fc),mul(nts,qpow(n,mod-1-4))),qpow(Y-1,n));}
}
int main(){//freopen("tree.in","r",stdin);//freopen("tree.out","w",stdout);n=read(),Y=read(),op=read(),nts=qpow(Y,n),Y=qpow(Y,mod-2);if(op==0){for(int i=1,x,y;i<n;i++) x=read(),y=read(),P[mp(x,y)]=P[mp(y,x)]=true;for(int i=1;i<n;i++) if(P.count(mp(read(),read()))) nts=mul(nts,Y);printf("%d\n",nts); return 0;}if(op&1) printf("%d\n",Q1::solve());else printf("%d\n",Q2::solve());return 0;
} 

转载于:https://www.cnblogs.com/OYJason/p/10427135.html

http://www.lbrq.cn/news/2414575.html

相关文章:

  • 秦皇岛做网站seo如何优化网站推广
  • 淘宝购物返利网站开发最近三天的国际新闻大事
  • 英文垃圾站wordpress外链网盘
  • 网站建设与管理教程 全套上海最近3天疫情情况
  • 用什么软件可以做网站动态千锋教育培训怎么样
  • 网站建设估价近期国内热点新闻事件
  • 哪个平台做网站比较好2345网址导航安装
  • 网站设计合同注意事项seo推广知识
  • 做网站不能有中文字符自媒体平台排名前十
  • 三五互联做的网站怎么样网络营销八大工具
  • 互动网络游戏公司网站建设廊坊关键词优化报价
  • wordpress 页面编辑失败aso优化公司
  • 把自己做的网页发布到网站百度怎么发布自己的信息
  • 点播视频网站怎么建设网络营销成功案例ppt免费
  • 企业中标信息查询网涟源网站seo
  • 网站说服力营销型网站策划 pdf网推平台
  • 旅游做攻略用什么网站好情感营销的十大案例
  • 网站域名管理中心企业互联网推广
  • 武汉市东西湖区建设局官方网站seo入门书籍
  • 电商网站开发日志网站推广渠道
  • 1997年做网站是什么语言厦门网站优化公司
  • dw自己做网站百度推广代理公司
  • 金华建设二建哪个网站报名百度引流免费推广怎么做
  • 网站建设xywlcn营销型网站建设步骤
  • 自适应网站建设需要注意什么企业网站推广方案策划
  • 网站网页怎么做长沙优化科技
  • 替别人做设计的网站多少钱网站权重怎么看
  • wordpress 移动到回收站发生错误怎样创建一个网站
  • html5做网站导航页潍坊seo建站
  • 青岛教育平台网站建设google怎么推广
  • vxe-table 通过配置 ajax 方式自动请求数据,适用于简单场景的列表
  • Vue 脚手架——render函数
  • Vue3 面试题及详细答案120道 (1-15 )
  • delphi disqlite3 操作sqlite
  • 前端JavaScript进阶
  • IP协议介绍