对于这个题,没有什么好用的数学性质,那么考虑统计所有长度的路径条数
路径统计问题不难想到点分治之后统计每个点的路径条数即可
假设之前子树到根的距离集合存为B,其中B[i]表示到根距离为i的有多少条
当前子树为A,那么所有路径生成路径不拿发现符合A*B的卷积形式
即
而且对于一个分治块,路径长度不超过结点个数,因此规模可以降低到同阶
每次对一个子树用FFT计算统计,可以写出如下代码:
#include<cstdio>
#include<complex>
#include<iostream>
using namespace std;
typedef long long LL;
const int Mn=200005;
const double Pi=acos(-1);
struct Edge{int to,next;}w[Mn];
int n,cnt=0,h[Mn],vst[Mn],minn,tg,s[Mn],sz,prm[Mn];
LL sum[Mn],sp[Mn],sn[Mn];
complex<double>ft[Mn],fft1[Mn],fft2[Mn];
void FFT(complex<double>A[],int n,int ty){
int i,j,k,m;
complex<double>t0,t1;
for(i=0;i<n;i++){
for(j=0,k=i,m=1;m<n;m<<=1,j=(j<<1)|(k&1),k>>=1);
if(i<j)t0=A[i],A[i]=A[j],A[j]=t0;
}
ft[0]=1;
for(m=1;m<n;m<<=1){
t0=exp(complex<double>(0,ty*Pi/m));
fo