COGS 2437 暗之链锁 II 题解

【题意】

给出一个有n个点的无向图,其中有n-1条主要边且这些主要边构成一棵树,此外还有m条其他边,求斩断原图的一条主要边和k条其他边使得图不连通的方案数mod109+7的值。

注意,就算你切断一条主要边和不足k条附加边之后就已经使图不连通,你也需要再切够k条附加边才算一种方案。

【解法】

回顾原题暗之链锁,我们仍然从连通块之间相连的边入手。

所有合法方案中不外乎k+1种情况:

1.两个连通块之间没有附加边相连,那么只要在m条附加边中任选k条即可,ans+=C(m,k);

2.两个连通块之间有1条附加边相连,那么切断这条附加边之后再从剩下的m-1条边中任选k-1条边即可,ans+=C(m-1,k-1);

3.两个连通块之间有2条附加边相连,那么切断这2条附加边之后再从剩下的m-2条边中任选k-2条边即可,ans+=C(m-2,k-2);

......

k+1.两个连通块之间有k条附加边相连,那么切断这k条附加边(之后再从剩下的0条边中选0条边)即可,ans+=1;

注意,这里的k+1方案中用到了C(0,0),在这里我们认为C(0,0)=1(因为这确实是一种可行方案)。

总的思路就很明确了,使用树链剖分或者树上差分标记边来维护每条主要边连接的两个连通块间的附加边数,最后枚举每条边,对于一条边,如果它被标记了x次,那么ans+=C(m-x,k-x)。

再次强调,认为C(0,0)=1。另外,对于被标记超过k次的主要边,没有合法方案,跳过。

另外,鉴于组合数范围很小,不需要用到拓展Lucas,直接阶乘预处理之后欧拉定理(在这里也是费马小定理)算逆元即可,当然用拓展欧几里德或者线性筛也可以。

【后记】

本题作为暗之链锁的推广版,实际上除了组合数之外并没有什么难度的提高。

作为树剖练手题以及树上差分入门题,感觉出完题之后树剖熟练了很多。然而树上差分还是不熟,需要多打。

上一篇:从零开始学 Java - Spring AOP 实现主从读写分离


下一篇:在应用层通过spring特性解决数据库读写分离