gym105167E Erdős-Ginzburg-Ziv 题解

题意:给 \(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\) 过程中一直满足某种相反的性质即可,最终能找到一组相邻的性质相反的位置.

posted @ 2024-08-02 21:12  Laijinyi  阅读(12)  评论(0编辑  收藏  举报