1 条题解

  • 0
    @ 2025-8-24 22:23:26

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar s_r_f
    这里是一个只会背板和fst的蒟蒻

    搬运于2025-08-24 22:23:26,当前版本为作者最后更新于2020-08-07 12:42:58,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    一个O(n2log)O(n^2\log)垃圾做法

    考虑建出一张有向图G,G, 有边i>ji->j当且仅当存在一个正整数mm使得aima_i^maja_j在模pp意义下同余,,然后在图GG上计算答案..

    Part1:建图

    subtask1:模数为奇质数

    pp意义下存在原根,,设为g.g.

    那么每个aia_i都可以表示成gkig^{k_i}

    考虑求出一个数aia_i的指标和ϕ(p)\phi(p)gcd\gcd的值ki(kiϕ(p)):k_i(k_i|\phi(p)):

    显然kik_i为满足aiϕ(p)/ka_i^{\phi(p)/k}pp之后为11的最大的数..

    枚举每个质因数pp求它的次数,,这个工作就可以在O(d(ϕ(p))×logp)O(d(\phi(p)) \times \log p) 的时间内完成..

    那么,, i>ji->j存在当且仅当kikj.k_i|k_j.

    这样就可以O(1)O(1) checkcheck是否存在边i>ji->j

    subtask2:模数为奇质数qqt(t>1)t(t>1)次幂

    pkp^k意义下也存在原根..

    不难发现我们可以用同样的方法求出所有ki,k_i,但是这回一个数可能会是qq的倍数,,我们记aia_i的因数分解中存在的qq的个数为mi.m_i.

    这次我们怎么checkcheck i>ji->j是否可以连边呢??

    首先如果mi=mj=0,m_i=m_j=0,那么就直接用上一个subtasksubtask的做法即可..

    如果有一个m=0,m=0,而另一个m0,m ≠ 0,那么边i>ji->j不存在..

    如果mi0,mj0,m_i≠0,m_j≠0,那么我们可以直接计算出可能使aiz=aja_i^z=a_j的数字z,z=mj/mi,z,z=m_j/m_i,然后直接快速幂解决..

    那么就可以O(logp)O(\log p)的复杂度内checkcheck是否存在边i>ji->j

    如果害怕TT飞的话可以求出原根用光速幂,,不过O(n2logp)O(n^2\log p)实际情况下也能过..


    Part2:计算答案

    建出图之后,,我们考虑怎么计算答案..

    考虑一个aia_i对答案的贡献..

    有一个想法是aia_i在答案中存在的条件为当且仅当没有任何数能够表示出它,,记这些数的个数为cnt,cnt,那么aia_i对答案的贡献就是2cnt.2^{cnt}.

    但是这样做忽略了环的情况,,只能获得10pts.10pts.

    举个例子,,如果n=2,n=2,GG中存在边(1,2),(2,1),(1,2),(2,1),如果按照这种算法计算出来的答案就是2,2,而正确答案是3.3.

    那么这个问题怎么解决呢??

    不难发现如果有一个强联通分量S,S, SS内部的所有点必然是能两两连边的,,所以我们可以给一个强联通分量内的点强制一个顺序,,就可以正确的计算出答案了..

    代码:: 见云剪贴板


    Bonus:如何解决n105,p1018n\leq 10^5,p\leq 10^{18}

    首先求出phi(p),phi(p),pollardrhopollard-rho分解质因数,,并爆搜出phi(p)phi(p)的因子..

    对于gcd(ai,p)1\gcd(a_i,p)≠1aia_i的贡献,,

    可以直接O(nlogp×K)O(n\log p \times K)暴力解决,,其中KKphi(p)phi(p)的质因数个数..

    对于gcd(ai,p)=1\gcd(a_i,p)=1的数字,,

    首先用O(nlogp×K)O(n\log p \times K)的复杂度算出这O(n)O(n)个数的指标,,

    然后以这些因子为下标运行狄利克雷前缀和即可..

    复杂度O(nlogp×K+d(phi(p))×K)O(n\log p \times K + d(phi(p))\times K)

    代码:: 见云剪贴板

    • 1

    信息

    ID
    5793
    时间
    2000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者