BZOJ1041圓上的整點
阿新 • • 發佈:2019-01-24
problem
求一個給定的圓(),在圓周上有多少個點的座標是整數。
Input
只有一個正整數r,r<=2000 000 000
Output
整點個數
Sample Input
4
Sample Output
4
Hint
思路
顯然,對於所給半徑r,對應四個座標軸上的點一定在圓上;而對於四個象限內的座標,問題轉化為求解二次方程的整數解,其中 。記所得解組數為n,由對稱性則ans=(n+1)*4
方程有多少組整數解?,其中r的範圍為
易想到的做法是對x進行的列舉,判斷是否存在y,y∈ 滿足方程。
但注意到r的範圍,這種方法會超時。
下面這種方法,利用了互質數的特殊性質,可以將等式簡化,從而降低複雜度
,即A,B是互質的。我們利用同除以gcd的方法構造出了互質的兩個數A,B ,將其帶入上面*式,則得,又由於d|y(因為r+x,r-x中都含有d這個因子),所以得到為完全平方數。又因為A,B是互質的,所以A,B本身都是完全平方數。(下面給出這個性質的證明)
已知兩個數A,B是互質的,且,則A,B本身都是完全平方數
證明:由於A,B是互質的,則分解質因數後,他們不含有公共的因數 。A,B相乘,由於沒有相同的底數,則相當於把兩個質因數直接“拼接”在一起。而現在這個數是完全平方數,即每個指數都是偶數,因此原先A,B質因子分解的每個指數也是偶數。得證。
接著這題,設,因此。因此只有當d|2r時,這個等式才有解,也就等價於有解。所以我們列舉,得到2r的兩個因子(一大一小,成對出現),記為x,y。再去解方程即可(解這兩個方程用普通根號折中列舉方法)。