[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的更多相关文章
随机推荐
- idea 导入 java json 包
1.java 项目导包 找到 External Libraries 下面的java版本包,在点击鼠标右键.直接找到jar路径全部选中导入即可.
- •搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机
本节所讲内容: 实战:搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机 LAMP架构:??? Linux+Apache+Mysql+PHP Linux+Apache+Mysql/MariaDB ...
- linux percpu机制解析【转】
转自:http://blog.csdn.net/wh8_2011/article/details/53138377 一.概述 每cpu变量是最简单也是最重要的同步技术.每cpu变量主要是数据结构数组, ...
- java===java基础学习(12)---方法的重写和重载
覆盖 / 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也 ...
- Eclipse+Pydev+numpy+scipy+matplotlib
之前一直在linux环境下使用python,作为一枚小菜还是更喜欢windows.我使用python主要是进行科学计算,安装软件.搭建环境遇到了非常多的问题,特此总结. 一.python安装 版本:2 ...
- css设置div等标签背景半透明
三种方式: 1. background-color: transparent; 直接设置背景为透明 2.这种是子元素也会跟着变成半透明 /* 背景半透明,1为不透明 */ opacity: 0.5; ...
- Nginx-请求处理与响应
void ngx_http_init_connection(ngx_connection_t *c) { ngx_uint_t i; ngx_event_t *rev; struct sockaddr ...
- hdu 1044(bfs+dfs+剪枝)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- Message Queue中的推与拉(转)
Message Queue的设计和实现(7)http://mp.weixin.qq.com/s/zQdDBAHu1UgJJzxH2eCHgQ 数据发送中的推与拉. 当MQ要把数据给消费者的时候,就涉及 ...
- 前端获得session信息方式对比,优化
在开发中,页面 js 经常会遇到需要 当前登录用户信息(菜单权限,用户基本信息,配置信息) 的地方,一般情况我们可能对这些信息获取方式不是太在意,但是现在的前端通过webpack打包,即使做了代码分割 ...