CF1835D

原题

翻译

好题!图论用数论的解法真的很巧妙

首先注意读题,要恰好等于k因为我看错了

这题有没有边权都是可以做的,为了使这个做法更具普遍性,我们假设原题有边权

可以发现对于满足条件的点对(x,y)至少要满足他们在一个强联通分量内,所以我们可以在每一个强联通分量内计算答案

对于这个强联通分量内的q个环,把他们的环长分别记作leni,则由裴蜀定理可知,定义d=gcdi=1qleni,则对与d|s,我们一定可以构造出长为s的答案

但看到这个数据范围,我们肯定不能直接暴力计算所有环的长度,于是我们考虑通过别的方法求解d

我声称,对于一正整数pp|d的充要条件是找到一个数组disi满足对于原图所有的边(u,v,w),满足disvdisuw(modp)

下面证明其充要性:

  • 充分性:

    对于原图的某一个环,记其上所有边的编号所构成的集合为S,则必有iSwiiS(disvdisu)0(modp)即保证了p|len

  • 必要性:

    考虑构造证明,对于这个强联通图建任意一棵生成树,对于树边(u,v,w),我们令disv=disu+w

    对于某一个返祖边,我们可以用类似于充分性的证法证明此构造满足条件

    对于某一个横叉边,它如果只和树边结合是无法生成环的,但如果加入返祖边,我们可以通过以下操作构造“反向边”:

    对于一条边(u,v,w),我们想构造其反向边(v,u,w)。由于图强联通,所以我们可以找到任意一条vu的路径,这时显然形成了一个环,从v开始绕这个环p1次,再走vu的路径走到u点,容易得到走过路径长度dist(v,u)×p+w×(p1)w(modp)

    于是我们通过这种方法构造了一个经过横叉边的环,通过类似于证明充分性的方法可以证明此构造合法;

    前向边证法类似于横叉边

根据以上证明我们可以构造出数组disi,这个数组在modp下成立是p|d的充要条件,因此d=gcdi=1m(disvdisuw)

求出d后不难发现对于点对(x,y)成为答案的条件是disxdisydisydisxk(modd)

容易知道要么k0(modd),要么kd2(modd)

如果不满足条件,直接输出0即可;否则我们可以开一个桶记录之前出现过的所有disxmodd

总复杂度O(n+m)

posted @   FOX_konata  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示