1. 程式人生 > >BZOJ1041圓上的整點

BZOJ1041圓上的整點

problem

求一個給定的圓(x2+y2=r2),在圓周上有多少個點的座標是整數。

Input

只有一個正整數r,r<=2000 000 000

Output

整點個數

Sample Input

4

Sample Output

4

Hint

科普視訊

思路

顯然,對於所給半徑r,對應四個座標軸上的點一定在圓x2+y2=r2上;而對於四個象限內的座標,問題轉化為求解二次方程x2+y2=r2的整數解,其中x>0,y>0 。記所得解組數為n,由對稱性則ans=(n+1)*4

x2+y2=r2方程有多少組整數解?,其中r的範圍為2109

易想到的做法是對x進行[1,r22]的列舉,判斷是否存在y,y∈N+ 滿足方程。

但注意到r的範圍,這種方法會超時。

下面這種方法,利用了互質數的特殊性質,可以將等式簡化,從而降低複雜度

xx+yy=r2y2=r2x2=(r+x)(rx)d=gcd(r+x,rx),gcd(r+xd,rxd)=1

A=

r+xd,B=rxd,即A,B是互質的。我們利用同除以gcd的方法構造出了互質的兩個數A,B ,將其帶入上面*式,則得ABd2=y2,AB=(yd)2,又由於d|y(因為r+x,r-x中都含有d這個因子),所以得到AB為完全平方數。又因為A,B是互質的,所以A,B本身都是完全平方數。(下面給出這個性質的證明)

已知兩個數A,B是互質的,且AB=C2,C,則A,B本身都是完全平方數

證明:由於A,B是互質的,則分解質因數後,他們不含有公共的因數p 。A,B相乘,由於沒有相同的底數,則相當於把兩個質因數直接“拼接”在一起。而現在這個數是完全平方數,即每個指數都是偶數,因此原先A,B質因子分解的每個指數也是偶數。得證。

接著這題,設A=a2,B=b2,因此a2+b2=2rd。因此只有當d|2r時,這個等式才有解,也就等價於xx+yy=r2有解。所以我們列舉{d|d|2r},得到2r的兩個因子(一大一小,成對出現),記為x,y。再去解方程a2+b2=xa2+b2=y即可(解這兩個方程用普通根號折中列舉方法)。