[xsy2289]B
题意:给一棵树,一次操作定义为删掉一条树边再加一条边,并且满足加完边后这还是一棵树,问在进行不超过$k$次操作后能构造出多少种不同的树
首先...矩阵树定理在边有边权的时候同样适用,这时可以把它看成重边,此时直接按原方法求得的是所有生成树的边权乘积之和
所以我们可以把这棵树补成一个完全图,令补上去的边边权为$x$,那么答案就是求出来的多项式的$0\cdots k$次系数之和
直接带着多项式做当然不行,所以我们就用单位根作为$x$,求值后IDFT回去即可
我的代码在$k=n-1$时会错...?
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; typedef long long ll; const int mod=998244353; int mul(int a,int b){return a*(ll)b%mod;} int ad(int a,int b){return(a+b)%mod;} int de(int a,int b){return(a-b)%mod;} int pow(int a,int b){ int s=1; while(b){ if(b&1)s=mul(s,a); a=mul(a,a); b>>=1; } return s; } int rev[64],N,iN; void pre(int n){ int i,k; for(N=1,k=0;N<=n;N<<=1)k++; for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1)); iN=pow(N,mod-2); } void ntt(int*a,int on){ int i,j,k,t,w,wn; for(i=0;i<N;i++){ if(i<rev[i])swap(a[i],a[rev[i]]); } for(i=2;i<=N;i<<=1){ wn=pow(3,on==1?(mod-1)/i:mod-1-(mod-1)/i); for(j=0;j<N;j+=i){ w=1; for(k=0;k<i>>1;k++){ t=mul(w,a[i/2+j+k]); a[i/2+j+k]=de(a[j+k],t); a[j+k]=ad(a[j+k],t); w=mul(w,wn); } } } if(on==-1){ for(i=0;i<N;i++)a[i]=mul(a[i],iN); } } int d[64],tr[64][64],g[64][64],n; int gauss(int n){ int i,j,k,t,c,s; s=1; for(i=1;i<=n;i++){ t=pow(g[i][i],mod-2); for(j=i+1;j<=n;j++){ c=mul(t,g[j][i]); for(k=i;k<=n;k++)g[j][k]=de(g[j][k],mul(c,g[i][k])); } s=mul(s,g[i][i]); } return s; } int solve(int x){ int i,j; memset(g,0,sizeof(g)); for(i=1;i<=n;i++)g[i][i]=ad(d[i],mul(n-1-d[i],x)); for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(i!=j){ if(tr[i][j]) (g[i][j]-=1)%=mod; else (g[i][j]-=x)%=mod; } } } return gauss(n-1); } int po[64]; int main(){ int k,i,x,s; scanf("%d%d",&n,&k); if(k==n-1){ printf("%d",pow(n,n-2)); return 0; } for(i=2;i<=n;i++){ scanf("%d",&x); x++; tr[x][i]=tr[i][x]=1; d[x]++; d[i]++; } pre(n); for(i=0;i<N;i++)po[i]=solve(pow(3,(mod-1)/N*i)); ntt(po,-1); s=0; for(i=0;i<=k;i++)s=ad(s,po[i]); printf("%d",ad(s,mod)); }
[xsy2289]B的更多相关文章
随机推荐
- sass_安装问题(ERROR: Could not find a valid gem 'sass' (>= 0), here is why: Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: cert)
安装sass前需安装ruby 安装好ruby好打开命令行,输入 gem install sass 出现错误: ERROR: Could not find a valid gem 'sass' (> ...
- 转 Wireshark和TcpDump抓包分析心得
1. Wireshark与tcpdump介绍 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Windows平台下使用Wireshark,如果是Linux的话 ...
- 设计模式之笔记--桥接模式(Bridge)
桥接模式(Bridge) 定义 桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化. 类图 描述 Abstraction:定义抽象部分的接口,通常在这个接口里面要维护一个实 ...
- python logging system
官方教程:https://docs.python.org/2/library/logging.html 1. 用法1 import logging import logging.handlers L ...
- how to create view (windows)
View Server List IP address: 200.xx.xx.xx How to create a new view ssh new view server by your Unix ...
- JS判断客户端是否是iOS或者Android手机移动端
var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...
- 关于 拼接 url 连接 参数的问题(爬虫)。
比如这里 我找的 后台请求的json的链接: 第一页: http://www.igoldenbeta.com:8080/cn-jsfund-server-mobile/bkt/api?appkey=1 ...
- 看懂sh脚本
1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编写脚本完成时 ...
- 一、python基础相关知识体系
python基础 a. Python(解释型语言.弱类型语言)和其他语言的区别? 一.编译型语言:一次性,将全部的程序编译成二进制文件,然后在运行.(c,c++ ,go) 运行速度快.开发效率低 二. ...
- hdu 2768(建图,最大点独立集)
Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...