题意:给 \(p\) 和 \(p-1\) 个边权,要用这些边权构造树,每个点编号 \(0\sim p-1\),使得每个点 \(u\) 到 \(0\) 的距离 \(\bmod\ p=u\),无解输出 -1,保证 \(p\) 是质数、\(p\le 10^6\)、边权 \(\in [1..p-1]\).
Solution
考虑加边的过程,树最开始只有根节点 0,然后通过加边不断地引入新的点
首先一定是有解的,证明:若边 \(x\) 不能被加入,则 \(\forall\) 树上的点 \(y\),\(y+x\) 也在树上(否则就有机会让该边加入),又因为 \(p\) 为质数,推出所有点都在树上,矛盾.
对于一个边权 \(x\),我们想找到一个 \(k\),使得 \(kx\bmod p\) 在树上,且 \((k+1)x\bmod p\) 不在树上,这样我们可以连接这两个点.
怎么找呢?考虑用一个奇怪的二分,满足 \(l\cdot x\bmod p\) 总是在树上,\(r\cdot x\bmod p\) 总是不在树上,\(l+1=r\) 时就停止;
每次判断 \(mid\cdot x\bmod p\) 是否在树上,若不是就 \(r\gets mid\),否则 \(l\gets mid\).
这样距离每次减半,时间复杂度 \(O(p\log p)\).
初始 \(l=0\),\(r=a\cdot x^{-1}\),\(a\) 是最大的一个不在树上的点
这样的二分很神奇,他不需要任何单调性,只需要 \(l\) 和 \(r\) 过程中一直满足某种相反的性质即可,最终能找到一组相邻的性质相反的位置.
标签:Ziv,cdot,题解,bmod,mid,Erd,树上,边权 From: https://www.cnblogs.com/laijinyi/p/18339614