[bzoj1041]圆上的整点
设$x^2+y^2=n^2$,令$d=gcd(x,y)$,那么$n'^2=x'^2+y'^2$,即$y'=\sqrt{n'^2-x'^2}$
由于$gcd(n'+x',n'-x')=1$,因此$n'+x'$和$n'-x'$都应该是完全平方数
由于d是n的约数,所以枚举d,令$n'-x'=a^2$,暴力枚举a(范围为$\sqrt{n/d}$)并判定$n'+x'$是否是完全平方数以及x'和y'是否互素
最终总复杂度为$o(n^{3/4}logn)$(同洲阁筛),可以通过本题
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,ans; 4 int gcd(int n,int m){ 5 if (!m)return n; 6 return gcd(m,n%m); 7 } 8 void tot(int n){ 9 for(int i=1;i*i<=n;i++){ 10 int x=(int)sqrt(2LL*n-i*i); 11 if ((1LL*x*x-n==n-i*i)&&(gcd(i,x)==1)&&((x>1)||(i>1)))ans++; 12 } 13 } 14 int main(){ 15 scanf("%d",&n); 16 for(int i=1;i*i<=n;i++) 17 if (n%i==0){ 18 tot(i); 19 if (i*i!=n)tot(n/i); 20 } 21 printf("%d",8*ans+4); 22 }