P6730 [WC2020] 猜数游戏

首先,考虑一个问题:有一张有向图,选择最少的点,使得每个点都能由这些点出发而到达。
可以用如下方法:
先tarjan缩点,变成DAG。然后在入度为0的SCC中各选一个点。
正确性显然。
对于这道题,先预处理出所有数之间的关系,方法等下讲。然后暴力就是枚举\(2^n-1\)种情况,再套用上述做法。
正解就是考虑每个SCC的贡献,实现非常简单。
考虑如何处理出所有数之间的关系:
不难发现这就是BSGS的判定。可以暴力BSGS。
但其实有更好的方法。
首先,求出原根g。
然后,设\(ord_i\)表示使\(g^{ord_i}=a_i (Mod P)\)的最小整数。
那么,若\(gcd(ord_i,\phi(P))|ord_j\),则i能推出j。
因此只要求出\(k_i=gcd(ord_i,\phi(P))\),即可。
容易证明,这个等价于求使得\({a_i}^{\frac{\phi(P)}{k}}=1 (Mod P)\)的最大的k。这个把\(\phi(P)\)质因数分解,用快速幂判断即可。
代码略。

posted @ 2020-08-08 22:25  lnzwz  阅读(193)  评论(0编辑  收藏  举报