洛谷比賽【泯滅:整除】
官方的題解看不懂,問了終於聽懂了,感覺是一個很神奇的方法,所以就記一下了。
首先題目要求求出的方程的解的個數,其中。
題目給的的讀入方式很特別,已經在提示你需要將分解,並且不是質數,但是同餘方程在模數為質數的情況下更容易發現特殊性質,所以我們將方程轉化為另外一種形式:
令,那麼有如下轉換:
這個很好理解,甚至感覺很像,有這個感覺就很對啦。
我們只要知道右面的方程組有多少個不同的解就行了,我們先分開考慮對於每一個方程有多少個滿足條件的解,對於,如果令滿足條件的構成的集合為,那麼如果我們從每個方程的解的集合裡選一個數出來,求出一個滿足所有方程選出來的,也就是下面這個方程組:
那麼解出來的答案就是滿足要求的,如果我們用求解這個方程組,可以得到一個最小的合法的解,雖然都是滿足上面方程的,但是由於我們對解的範圍有限制,可以發現只有滿足條件,也就是說,一個方程組唯一對應一個解,那麼求出有多少不同的方程組,就求出了題目要求的答案。
那麼顯然,答案就是下面這個公式:
對於每一個,可以暴力列舉所有可能的解來求出集合大小,那麼複雜度是,算下來感覺不太對,但是卡卡常就能卡過此題。
其實我們有更優秀的演算法。
在提交記錄裡我們發現一份複雜度異常優秀的程式碼,我們研究了一下發現,對於求解,有一個神奇的公式:
有了這個公式,複雜度就直接降到了,簡直是太美妙了。
但是怎麼證明?
給定和,且為質數:
證明:
我們想求出當時,的的個數,首先考慮為奇質數的情況,這個時候一定存在一個原根,根據原根的性質,在的意義下一定可以表示成,但是除外,不過因為必定滿足上面的方程,所以最後加就行,現在公式就轉化成了,根據費馬小定理得到,移項得到,兩邊同時除以得到,由於,則必定是的倍數,可以知道的倍都是合法的,大於倍的都是重複的,所以有個不同的滿足條件,之前說過還有沒計算,所以答案為個。
上面之所以說奇質數,是因為沒有原根,上面的證明用到了原根,但是實際上也滿足那些有原根的數的性質,所以證明依然成立。
關於原根,還是之前學的時候瞭解的,沒想到還能用在這個的證明上面,但是對於同餘方程這些和剩餘繫有關的東西,當實在沒有思路的時候,確實應該往原根上想一想,尤其是模數為質數的時候。