题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041
题目大意:求一个给定圆x^2+y^2=r^2上有多少个整点 r<=2e9
题目分析:我们对原式进行变形,(r-x)(r+x)=y*y我们设r-x和r+x的最大公约数为d,那么(r-x)/d的值一定也为平方数,我们设它为u^2。同理我们设r+x=d*v^2。那么2r=d*(u^2+v^2),y=d*u*v,x=d*(v^2-u^2)/2。所以我们先枚举d,再枚举u,然后判断u和v的最大公约数是不是1即可。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; const int maxn=1000008; int d; LL r; int ans=0; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } LL gcd(LL a,LL b) { return b==0?a:gcd(b,a%b); } void work(LL x) { LL t=(2*r)/x; LL dd=sqrt(t); for (int i=1;i<=dd;i++) { LL j=sqrt(t-i*i); if (j*j!=t-i*i||i>j||gcd(i,j)>1) continue; ans++; } } int main() { cin>>r; LL d=sqrt(2*r); for (int i=1;i<=d;i++) { if ((2*r)%i) continue; work(i); if (d*d==2*r) break; work((2*r)/i); } ans*=4; cout<<ans<<endl; return 0; }