考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是。

想到了树形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.的更多相关文章

  1. 5.10 省选模拟赛 tree 树形dp 逆元

    LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...

  2. 6.18 省选模拟赛 树 倍增 LCT

    LINK:树 考虑暴力 保存每个版本的父亲 然后暴力向上跳.得分20. 考虑离线 可以离线那么就可以先把树给搞出来 然后考虑求k级祖先 可以倍增求. 如何判断合法 其实要求路径上的边的时间戳<= ...

  3. 5.29 省选模拟赛 树的染色 dp 最优性优化

    LINK:树的染色 考场上以为这道题要爆蛋了 没想到 推出正解来了. 反正是先写了爆搜的 爆搜最近越写越熟练了 容易想到dp 容易设出状态 f[i][j]表示以i为根的子树内白色的值为j此时黑色的值怎 ...

  4. 5.13 省选模拟赛 优雅的绽放吧,墨染樱花 多项式 prufer序列 计数 dp

    LINK:优雅的绽放吧,墨染樱花 当时考完只会50分的做法 最近做了某道题受到启发 故会做这道题目了.(末尾附30分 50分 100分code 看到度数容易想到prufer序列 考虑dp统计方案数. ...

  5. 4.13 省选模拟赛 传销组织 bitset 强连通分量 分块

    考试的时候昏了头 没算空间 这道题我爆零了.值得注意的是 一般认为bitset的空间是 int 的1/w倍 对于那m条边 无论如何构造 这m条关系都是存在的 题目其实是想让我们用这m条关系来计算给出的 ...

  6. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  7. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  8. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

  9. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

随机推荐

  1. HTML5 Canvas绘图基本使用方法, H5使用Canvas绘图

    Canvas 是H5的一部分,允许脚本语言动态渲染图像.Canvas 定义一个区域,可以由html属性定义该区域的宽高,javascript代码可以访问该区域,通过一整套完整的绘图功能(API),在网 ...

  2. Java面向对象—常见面试题

    2. Java 面向对象 2.1. 类和对象 2.1.1. 面向对象和面向过程的区别 面向过程 :面向过程性能比面向对象高. 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量 ...

  3. docker自动化部署前端项目实战一

    docker自动化部署前端项目实战一 本文适用于个人项目,如博客.静态文档,不涉及后台数据交互,以部署文档为例. 思路 利用服务器node脚本,监听github仓库webhook push事件触发po ...

  4. [JAVA]移位运算(左移<<,右移>>和无符号右移>>>)

    一.背景知识 整数在内存中是以二进制的形式存在的,而且存的是该整数的补码.最高位代表符号位,正数为0,负数为1 正数的补码是其二进制本身,负数的补码则是 符号位保持1不变,其他位按位取反再加1,+0和 ...

  5. NPOI升级版本问题

    最近做了一个导出Word的功能,需要样式与排版果断选择了NPOI,本以为支持Excel很好,支持Word应该也不会错吧,万万没想到还是挣扎了小一星期. 我的项目是一个13年项目,NPOI版本还很旧,我 ...

  6. MySQL入门(函数、条件、连接)

    MySQL入门(四) distinct:去重 mysql>: create table t1( id int, x int, y int ); mysql>: insert into t1 ...

  7. 题解:2018级算法第五次上机 C5-图2

    题目描述: 样例: 实现解释: 所有结点对最短路径的板子题 知识点: 寻找所有结点对最短路径,动态规划 坑点: 无坑,注意建边即可 使用的算法为floyd算法 按照程序顺序解释如下: 首先建图,以邻接 ...

  8. 【网鼎杯2018】fakebook

    解题过程: 首先进行目录扫描,发现以下目录: user.php.bak login.php flag.php user.php robots.txt user.php.bak猜测存在源码泄露. 查看源 ...

  9. window10下启动vue项目具体步骤

    1. 安装nodejs 直接去nodejs官方网站下载安装包(https://nodejs.org/zh-cn/) 然后在cmd窗口里面输入 node -v 可以检测出来nodejs是否在全局环境下安 ...

  10. A Great Alchemist 最详细的解题报告

    题目来源:A Great Alchemist A Great Alchemist Time limit : 2sec / Stack limit : 256MB / Memory limit : 25 ...