zoukankan      html  css  js  c++  java
  • 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))质因数分解,用快速幂判断即可。
    代码略。

  • 相关阅读:
    PHP中echo和print的区别
    Python input和raw_input的区别
    for,if语句
    Mac下安装PEAR
    IOS之代理
    socket总结
    jQuery 遍历函数 ,javascript中的each遍历
    DP:最大公共子序列
    6.2省赛总结
    NEUOJ1302最大子序列
  • 原文地址:https://www.cnblogs.com/lnzwz/p/13460710.html
Copyright © 2011-2022 走看看