HDU6128 二次剩余/二次域求二次剩余解/LL快速乘法取模
LINK
題意:求滿足模p下$\frac{1}{a_i+a_j}\equiv\frac{1}{a_i}+\frac{1}{a_j}$的對數,其中$n,p(1\leq n\leq10^5,2\leq p\leq10^{18})$
思路:推式子,兩邊同乘$(a_i + a_j)^3$,得$a_i^2+a_j^2 \equiv {a_i·a_j} \mod{p}$,進一步$a_i^2+a_j^2+a_i·a_j\equiv {0} \mod{p}$,然後?然後會點初中數競,或者數感好會因式分解就能看出來,兩邊再乘個$a_i-a_j$就是$a_i^3-a_j^3$了,直接得到了$a_i$和$a_j$的關系,可喜可賀。然而顯然我這種蠢得的人看不出來的,一般性的我們使用一元二次求根公式,視$a_j$為常數,得在模p下的解$a_i=a_j·\frac{-1 \pm \sqrt{-3}}{2}$,那麽得到了$a_i$和$a_j$的關系,但是有$\sqrt{-3}$的存在,也就是要想辦法求到$x^2 \equiv{-3} \mod{p}$的解,來替代原式中的根號,這個頭次見到還是浙大校賽的ZOJ3774,當時還奇怪為什麽有人能直接看出xx數就是$\sqrt{5}$的二次剩余。
這裏用到二次剩余的相關知識,前置知識是看二次剩余有關的教學ppt(歐拉判別,勒讓德符號之類的),求二次剩余的解有種二次域的求法(參見wiki上的Cipolla‘s algorithm),還有這位菊苣的博客,acdream菊苣的博客上也有模板和一些介紹......
因為半桶水,證明或算法在此不表。
其他要註意給出數據有可能為0,且要進行歐拉判別模p下是否存在二次剩余為-3的解,以及p=3的情況,還有就是因為LL下乘法溢出的問題,註意使用O(1)的$2^{64}$LL的取模乘法。
/** @Date : 2017-08-17 20:07:47 * @FileName: 1009.cpp * @Platform: Windows * @Author : Lweleth ([email protected]
HDU6128 二次剩余/二次域求二次剩余解/LL快速乘法取模