bzoj1041: [HAOI2008]圆上的整点
http://www.lydsy.com/JudgeOnline/problem.php?id=1041
设 X>0 ,Y>0
X^2 + Y^2 = R^2
X^2 = R^2-Y^2 = (R+Y)(R-Y)
令 d=gcd(R+Y,R-Y),A=(R+Y)/d,B=(R-Y)/d
则 gcd(A,B)=1,且A != B
X^2= d^2 *A * B
所以 A * B 为 完全平方数
又因为 gcd(A,B)=1 ,A!=B,所以 A,B 都是 完全平方数
令 a= 根号A,b=根号B
a^2 + b ^2 = 2*R / d
所以 d 必须是 2*R 的 约数
根号(2*R) 枚举 约数 d
1、a^2 + b^2 = 2*R / d
2、a^2 + b^2 = d
对于 每一种 情况 分别 根号复杂度 枚举 a,计算b
判断相应的 A ,B 是否满足 gcd=1 且 A!=B
满足则 ans+1
这只算出了第一象限的情况
根据园的对称性,ans*4 可得 所有 象限内的点
最后在加上4个在 坐标轴上的点即可
#include<cmath> #include<cstdio> using namespace std; typedef long long LL; LL R; int ans=0; int gcd(int A,int B) { return !B ? A : gcd(B,A%B); } void solve(int t,int d) { int n=sqrt(t*1.0); int A,B,b; for(LL a=1;a<=n;++a) { B=t-a*a; b=sqrt(B); if(b*b!=B || !B) continue; A=a*a; if(gcd(A,B)==1 && A!=B) ans++; } } int main() { scanf("%lld",&R); int n=sqrt(R*2.0); for(int d=1;d<=n;++d) { if(R*2%d==0) { solve(2*R/d,d); if(d*d!=n) solve(d,2*R/d); } } ans/=2; ans=ans*4+4; printf("%d",ans); }
1041: [HAOI2008]圆上的整点
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4640 Solved: 2092
[Submit][Status][Discuss]
Description
求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。
Input
只有一个正整数n,n<=2000 000 000
Output
整点个数
Sample Input
4
Sample Output
4