[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 }
View Code

 

posted @ 2019-10-28 10:19  PYWBKTDA  阅读(135)  评论(0编辑  收藏  举报