首先,考虑一个问题:有一张有向图,选择最少的点,使得每个点都能由这些点出发而到达。
可以用如下方法:
先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))质因数分解,用快速幂判断即可。
代码略。