4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.


考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是。
想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难。
这个时候 应该仔细观察一下 和再k次方之后会出现什么 容易发现是一个类似隔板法的东西。
也就是 选出k个点的集合 集合可重 代价为点权之积.
只需要把所有的情况都做出来就行了。
至于联通块考虑一个一个统计贡献。
这也就是说 对于每一个联通块来说我们指定一个根节点来统计 要不然会算重。
不难发现以每个点的子树内部为联通块 可以不重不漏的计算。
设状态 f[i][j]表示 i所在的连通块选出了j个点权的点权积之和.
容易发现转移 \(f[i][j]=(1-p)\cdot f[i][j]+\sum_{k=0}{j}f[x][k]\cdot f[tn][j-k]\cdot C(j,k)\)
为什么 后面要乘一个组合数 显然考虑将k次方展开之后 这其实是一个排列 那么方案数为 j!。
但是 f[x][k]中这k个数已经算了排列的数量了 同理f[tn][j-k]也是 所以可以把他们看成标号相同的点 所以各自要除以各自的阶乘。
显然每个点对答案的贡献为 (1-pfa)*f[x][k].
容易发现转移是一个卷积形式的 NTT优化即可。
const int MAXN=2050,G=3;
int n,k,len,ans,lim;
//int f[MAXN][MAXN]; f[i][j]表示以i为根的子树内 i所在的连通块中选出了j项的权值积之和.
//有 f[i][j]=(1-p)f[i][j]+f[tn][x]*f[i][j-x]*C(j,x) 显然是一个卷积NTT优化.
int f[MAXN][MAXN],b[MAXN],rev[MAXN],g[MAXN];
int fac[MAXN],inv[MAXN],A[MAXN],B[MAXN];
int lin[MAXN<<1],ver[MAXN<<1],nex[MAXN<<1],e[MAXN<<1];
inline int ksm(int b,int p){int cnt=1;while(p){if(p&1)cnt=(ll)cnt*b%mod;p=p>>1;b=(ll)b*b%mod;}return cnt;}
inline void add(int x,int y,int z)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
e[len]=z;
}
inline void NTT(int *a,int op)
{
rep(0,lim-1,i)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int len=2;len<=lim;len=len<<1)
{
int wn=ksm(G,op==1?(mod-1)/len:mod-1-(mod-1)/len);
int mid=len>>1;
for(int j=0;j<lim;j+=len)
{
int d=1;
for(int i=0;i<mid;++i)
{
int x=a[i+j],y=(ll)a[i+j+mid]*d%mod;
a[i+j]=(x+y)%mod;a[i+j+mid]=(x-y+mod)%mod;
d=(ll)d*wn%mod;
}
}
}
if(op==-1)
{
int inv=ksm(lim,mod-2);
rep(0,lim-1,i)a[i]=(ll)a[i]*inv%mod;
}
}
inline void mul(int *a,int *b)
{
rep(0,lim-1,i)
{
A[i]=(ll)a[i]*inv[i]%mod;
B[i]=(ll)b[i]*inv[i]%mod;
}
NTT(A,1);NTT(B,1);
rep(0,lim-1,i)g[i]=(ll)A[i]*B[i]%mod;
NTT(g,-1);
}
inline void dp(int x,int fa,int fp)
{
f[x][0]=1;
rep(1,k,i)f[x][i]=((ll)f[x][i-1]*b[x])%mod;
go(x)
{
if(tn==fa)continue;
dp(tn,x,e[i]);
mul(f[x],f[tn]);
rep(0,k,j)
{
f[x][j]=(ll)(1-e[i]+mod)*f[x][j]%mod;
f[x][j]=((ll)f[x][j]+(ll)g[j]*fac[j]%mod*e[i]%mod)%mod;
}
}
ans=(ans+(ll)f[x][k]*(1-fp+mod)%mod)%mod;
}
int main()
{
freopen("1.in","r",stdin);
get(n);get(k);
rep(1,n,i)get(b[i]);
rep(2,n,i)
{
int get(x);int get(y);
int get(a);int get(b);
a=(ll)a*ksm(b,mod-2)%mod;
add(x,y,a);add(y,x,a);
}
fac[0]=1;
rep(1,k,i)fac[i]=(ll)fac[i-1]*i%mod;
inv[k]=ksm(fac[k],mod-2);
fep(k-1,0,i)inv[i]=(ll)inv[i+1]*(i+1)%mod;
lim=1;while(lim<=k+k)lim=lim<<1;
rep(1,lim-1,i)rev[i]=rev[i>>1]>>1|((i&1)?lim>>1:0);
dp(1,0,0);put(ans);return 0;
}
4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.的更多相关文章
- 5.10 省选模拟赛 tree 树形dp 逆元
LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...
- 6.18 省选模拟赛 树 倍增 LCT
LINK:树 考虑暴力 保存每个版本的父亲 然后暴力向上跳.得分20. 考虑离线 可以离线那么就可以先把树给搞出来 然后考虑求k级祖先 可以倍增求. 如何判断合法 其实要求路径上的边的时间戳<= ...
- 5.29 省选模拟赛 树的染色 dp 最优性优化
LINK:树的染色 考场上以为这道题要爆蛋了 没想到 推出正解来了. 反正是先写了爆搜的 爆搜最近越写越熟练了 容易想到dp 容易设出状态 f[i][j]表示以i为根的子树内白色的值为j此时黑色的值怎 ...
- 5.13 省选模拟赛 优雅的绽放吧,墨染樱花 多项式 prufer序列 计数 dp
LINK:优雅的绽放吧,墨染樱花 当时考完只会50分的做法 最近做了某道题受到启发 故会做这道题目了.(末尾附30分 50分 100分code 看到度数容易想到prufer序列 考虑dp统计方案数. ...
- 4.13 省选模拟赛 传销组织 bitset 强连通分量 分块
考试的时候昏了头 没算空间 这道题我爆零了.值得注意的是 一般认为bitset的空间是 int 的1/w倍 对于那m条边 无论如何构造 这m条关系都是存在的 题目其实是想让我们用这m条关系来计算给出的 ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- @省选模拟赛03/16 - T3@ 超级树
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...
- 3.28 省选模拟赛 染色 LCT+线段树
发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...
- 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点
容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...
随机推荐
- 这些 CSS 命名规范将省下你大把调试时间
我听说很多开发者厌恶 CSS.而在我的经验中,这往往是由于他们并没有花时间来学习 CSS. CSS 算不上是最优美的『语言』,但迄今二十多年来,它都是美化 web 举足轻重的工具.从这点来说,也还算不 ...
- 阿里巴巴java-数据库开发手册(2020泰山版)
阿里巴巴编程规范.数据库命名规范 首先感谢阿里,在此我也分享给小伙伴们学习,下载地址如下: 链接:https://pan.baidu.com/s/19SLpiJmyNEIKuRscftRk9Q 提取码 ...
- Flask——实现上传功能
1.实例 #!-*-coding=utf-8-*- # from flask import Flask # # app = Flask(__name__) # # # @app.route('/') ...
- 【Blazor】在ASP.NET Core中使用Blazor组件 - 创建一个音乐播放器
前言 Blazor正式版的发布已经有一段时间了,.NET社区的各路高手也创建了一个又一个的Blazor组件库,其中就包括了我和其他小伙伴一起参与的AntDesign组件库,于上周终于发布了第一个版本0 ...
- NW.js Mac App 签名公证流程
使用 Developer ID 为 Mac 软件签名 - Apple Developer 在MacOS 10.15之前,应用如果没有签名(signature),那么首次打开时就会弹出"无法验 ...
- class文件的基本结构及proxy源码分析二
前文地址:https://www.cnblogs.com/tera/p/13267630.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
- 数据可视化之powerBI技巧(二十)采悟:创建度量值,轻松进行分组统计
上一篇文章中的分组,都是通过新建列的方式实现的,直观上比较容易理解.不过这样都修改了原始数据的结构,如果我们不在源表上进行修改,直接通过度量值的方式来进行分组,是否可以实现呢? 答案当然是肯定的. 采 ...
- 数据可视化之DAX篇(八) DAX学习:使用VAR定义变量
https://zhuanlan.zhihu.com/p/64414205 前面介绍如何使用DAX生成日期表的时候,使用了VAR,有人留言问这个VAR怎么理解,那么这篇文章就来介绍VAR以及它的用法. ...
- A Broken Calculator 最详细的解题报告
题目来源:A Broken Calculator 题目如下(链接有可能无法访问): A Broken Calculator Time limit : 2sec / Stack limit : 256M ...
- C#-CLR note - 26线程
开篇 async/wait的使用 static async Task Main(string[] args) { Console.WriteLine("start-- "); va ...