首页 > 其他分享 >luogu P4002 [清华集训2017]生成树计数

luogu P4002 [清华集训2017]生成树计数

时间:2022-12-28 22:33:10浏览次数:70  
标签:prod frac limits int luogu sum 2017 P4002 define

题面传送门

容易想到放到prufer序列上,变成下面的形式。

\(\sum\limits_{\sum c_i=n-2}{\frac{(n-2)!}{\prod\limits_{i=1}^{n}{c_i!}}\prod\limits_{i=1}^{n}{a_i^{c_i+1}(c_i+1)^m}\sum\limits_{i=1}^{n}{(c_i+1)^m}}\)

\(=(n-2)!\prod\limits_{i=1}^n{a_i}\sum\limits_{\sum c_i=n-2}{\prod\limits_{i=1}^n{\frac{a_i^{c_i+1}(c_i+1)^m}{c_i!}}\sum\limits_{i=1}^{n}{(c_i+1)^m}}\)

设\(A_x(x)=\sum\limits_{i=0}^{\infty}{\frac{a_x^i(i+1)^m}{i!}[x_n]},B_x(x)=\sum\limits_{i=0}^{\infty}{\frac{a_x^i(i+1)^{2m}}{i!}[x_n]}\)

即求\(\sum\limits_{i=1}^{n}{B_i(x)\prod\limits_{j\not =i}{A_j(x)}}\)

\(=\sum\limits_{i=1}^{n}{\frac{B_i(x)}{A_i(x)}}\prod\limits_{i=1}^{n}{A_i(x)}\)

\(=\sum\limits{\frac{B_i(x)}{A_i(x)}}\exp \sum\limits_{i=1}^{n}{\ln A_i(x)}\)

问题即为求\(f_i=\sum\limits_{j=1}^{n}{(a_j)^i}\)虽然暴力能过

生成函数为\(\frac{1}{1-a_ix}\)

\(\sum\limits{\frac{1}{1-a_ix}}=\frac{\sum\limits_{i=1}^n{\prod\limits_{j\not =i}{1-a_jx}}}{\prod{1-a_ix}}\)

设上面为\(P(x)=\sum\limits_{i=0}^{\infty}{p_ix^i}\),下面为\(Q_i=\sum\limits_{i=0}^{\infty}{q_ixi}\)。

对比系数以后可得\(q_i(n-i)=p_i\),则分治+NTT乘出\(Q\)即可。

时间复杂度\(O(n\log ^2n)\)

code:

#include<bits/stdc++.h>
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((m)*(x-1)+(y))
#define R(n) (rnd()%(n))
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned ll;
using namespace std;const int N=(1<<16)+5,M=170+5,K=1e5+5,mod=998244353,Mod=mod-1;const ll INF=1e18+7;const db eps=1e-5;mt19937 rnd(time(0));
int n,m,k,x,y,z;ll A[N],B[N],C[N],frc[N],Inv[N],D[N],f[N];
ll mpow(ll x,int y=mod-2){ll Ans=1;while(y) y&1&&(Ans=Ans*x%mod),y>>=1,x=x*x%mod;return Ans;} 
namespace Poly{const int G=3,Ig=mpow(G);
	int tr[N];ll C[N],D[N],f[N],g[N],H[N];
	void Init(int n){for(k=1;k<=2*n;k<<=1);for(int i=0;i<k;i++) tr[i]=(tr[i>>1]>>1)|((i&1)?k/2:0);}
	void NTT(ll *A,int k,int Fl){
		int i,j,h;ll key,now,pus;for(i=0;i<k;i++) tr[i]<i&&(swap(A[i],A[tr[i]]),0);
		for(i=2;i<=k;i<<=1){
			for(key=mpow(Fl?G:Ig,(mod-1)/i),j=0;j<k;j+=i){
				for(now=1,h=j;h<j+i/2;h++) pus=now*A[h+i/2]%mod,A[h+i/2]=(A[h]-pus+mod)%mod,A[h]=(A[h]+pus)%mod,now=now*key%mod;
			}
		}if(Fl) return;ll Iv=mpow(k);for(i=0;i<k;i++) A[i]=A[i]*Iv%mod;
	}
	void Inv(ll *A,ll *B,int n){
		if(n==1){B[0]=mpow(A[0]);return;}Inv(A,B,n+1>>1);int i;Init(n);for(i=0;i<n;i++) C[i]=A[i],D[i]=B[i];
		NTT(C,k,1);NTT(D,k,1);for(i=0;i<k;i++) C[i]=D[i]*(2+mod-C[i]*D[i]%mod)%mod;NTT(C,k,0);for(i=0;i<n;i++) B[i]=C[i];
		for(i=0;i<k;i++) C[i]=D[i]=0;
	}
	void Ln(ll *A,ll *B,int n){
		int i;Inv(A,f,n);Init(n);for(i=0;i<n;i++) g[i]=A[i+1]*(i+1)%mod;NTT(f,k,1);NTT(g,k,1);for(i=0;i<k;i++) f[i]=f[i]*g[i]%mod;NTT(f,k,0);
		B[0]=0;for(i=1;i<n;i++) B[i]=f[i-1]*mpow(i)%mod;for(i=0;i<k;i++) g[i]=f[i]=0;
	}
	void Exp(ll *A,ll *B,int n){
		if(n==1){B[0]=1;return;}Exp(A,B,n+1>>1);int i;Ln(B,H,n);for(i=0;i<n;i++) H[i]=((!i)+mod+A[i]-H[i])%mod;
		Init(n);for(i=0;i<n;i++) C[i]=B[i];NTT(H,k,1);NTT(C,k,1);
		for(i=0;i<k;i++) C[i]=C[i]*H[i]%mod;NTT(C,k,0);for(i=0;i<n;i++) B[i]=C[i];for(i=0;i<k;i++) C[i]=H[i]=0;
	}
	void calc(ll *A,int l,int r){
		if(l==r) return;int i,m=l+r>>1;calc(A,l,m);calc(A,m+1,r);Init(r-l+1);
		for(i=2*l-2;i<=2*m-1;i++) C[i-2*l+2]=A[i];for(i=2*(m+1)-2;i<=2*r-1;i++) D[i-(2*(m+1)-2)]=A[i];
		NTT(C,k,1);NTT(D,k,1);for(i=0;i<k;i++) C[i]=C[i]*D[i]%mod;NTT(C,k,0);for(i=2*l-2;i<=2*r-1;i++) A[i]=C[i-2*l+2];
		for(i=0;i<k;i++) C[i]=D[i]=0;
	}
}
int main(){
	int i,j;scanf("%d%d",&n,&m);for(i=1;i<=n;i++) scanf("%lld",&C[i]);
	for(frc[0]=Inv[0]=i=1;i<=n;i++) frc[i]=frc[i-1]*i%mod,Inv[i]=mpow(frc[i]);
	for(i=1;i<=n;i++) D[2*i-2]=1,D[2*i-1]=mod-C[i];Poly::calc(D,1,n);D[n]=0;for(i=0;i<n;i++) A[i]=D[i]*(n-i)%mod;
	Poly::Inv(D,f,n);Poly::Init(n);Poly::NTT(f,k,1);Poly::NTT(A,k,1);for(i=0;i<k;i++) f[i]=f[i]*A[i]%mod;Poly::NTT(f,k,0);
	for(i=0;i<k;i++) D[i]=A[i]=0;
	for(i=0;i<n;i++) A[i]=mpow(i+1,m)*Inv[i]%mod,B[i]=mpow(i+1,2*m)*Inv[i]%mod;
	Poly::Inv(A,D,n);Poly::Init(n);Poly::NTT(B,k,1);Poly::NTT(D,k,1);for(i=0;i<k;i++) B[i]=B[i]*D[i]%mod;Poly::NTT(B,k,0);for(i=n;i<k;i++) B[i]=0;
	Me(D,0);Poly::Ln(A,D,n);for(i=0;i<n;i++) D[i]=D[i]*f[i]%mod,B[i]=B[i]*f[i]%mod;Me(A,0);Poly::Exp(D,A,n);
	Poly::Init(n);Poly::NTT(B,k,1);Poly::NTT(A,k,1);for(i=0;i<k;i++) A[i]=A[i]*B[i]%mod;Poly::NTT(A,k,0);
	ll Ans=A[n-2];for(i=1;i<=n;i++) Ans=Ans*C[i]%mod;printf("%lld\n",Ans*frc[n-2]%mod);
} 

标签:prod,frac,limits,int,luogu,sum,2017,P4002,define
From: https://www.cnblogs.com/275307894a/p/17011426.html

相关文章

  • LOJ 6041 「雅礼集训 2017 Day7」事情的相似度 题解 (SAM+启发式合并)
    题目链接首先很容易想到的是对反串求SA和LCP,然后询问就是求起点在某个区间内的所有后缀两两LCP的最大值,可以用莫队解决,时间复杂度\(O(n\sqrtnlogn)\),应该是过不了的。......
  • coco2017keypoint的都含有哪些关键点
    下边是我从coco2017keypoint截取的部分代码。"categories":[{"supercategory":"person","id":1,"name":"person","keypoints":["nose","left_eye","right_eye","left......
  • 用一个词来总结即将过去的2017年~"本号还活着"
    我活着吗?我还活着!!! 从2016活到了2017,从望京活到了村里,伴随着豆荚到土豆到大鱼,习惯了人来人往,也习惯了分分合合,唯独自己身边一起战斗的战友,没有舍得丢弃一个!吃饭时,好些人偶......
  • luogu P4565 [CTSC2018]暴力写挂
    题面传送门神tm部分分可过。首先这个式子先两倍变成\(d_x+d_y+dist(x,y)-2d'_{LCA(x,y)}\)如果我们按照情报中心那题的方法,枚举\(LCA(x,y)\),将\(d_x\)看成\(x\)的点权,\(......
  • 【NOIP2017提高A组集训10.28】三元组
    Description有X+Y+Z个三元组(x[i],y[i],z[i]),请你从每个三元组中挑数,并满足以下条件:1、每个三元组中可以且仅可以选择一个数(即x[i],y[i],z[i]中的一个)2、选择x[i]的三元......
  • 【NOIP2017提高A组集训10.28】图
    Description有一个n个点A+B条边的无向连通图,有一变量x,每条边的权值都是一个关于x的简单多项式,其中有A条边的权值是k+x,另外B条边的权值是k-x,如果只保留权值形如k+x的边,那么这......
  • AHOI,但是初中组,2017-2018
    你觉得我这种彩笔像是能去做省选题的样子吗?=w=合肥人,做初中的屑安徽题,很正常吧。AH也不知道为啥搞啥市赛啊区赛啊省赛啊就挺离谱的反正摆烂人也不想打┓( ´∀` )┏20......
  • Visual Studio 2017(vs2017)绿色便携版-北桃特供
    原版的VisualStudio2017有几十G,安装起来特别慢,不少用户叫苦连天。该版本是精简过的vs2017,且简化了原来的安装程序,特别适用于教学、个人开发者、某些要求不高的企业。该绿......
  • 基于OpenVINO的端到端DL网络-Tesseract5+VS2017+win10源码编译攻略
    一,记录我目前在win10X64和VS2017的环境下成功编译Tesseract5.0的方式;二,记录在VS2017C++工程中调用Tesseract4.0的方法;三,记录编译和调用Tesseract4.0过程中踩到的坑和相......
  • luogu P4775 [NOI2018] 情报中心
    题面传送门牛逼题,第一步转化都想不到。首先题目要求的是选出两条路径\((x_1,y_1),(x_2,y_2)\)满足有交,并且并的部分减去\(w_1+w_2\)最大。不妨假设\(p_1\)是\(x_1\)与\(......