BZOJ 1041 HAOI 2008 圆上的整点 数学推导
2016-03-27 11:28
344 查看
如果某整数x代入圆方程得到的y是整数就计入。
坐标轴上必有4个点,而且四象限对称,所以规定x,y≥1
∵x2+y2=r2
∴y2=r2−x2
∴y2=(r−x)(r+x)
∴y=(r−x)(r+x)−−−−−−−−−−−√
令d=gcd(r−x,r+x),A=r−xd,B=r+xd
∴gcd(A,B)=1
∴y=dAB−−−√
∴AB为完全平方数
∵A≠B
∴A,B是完全平方数
令a=A−−√,b=B−−√,a<b
∴a2=r−xd,b2=r+xd
∴a2+b2=2rd
∵a,b是整数
∴d|2r
于是d∈[1,2r−−√],a∈[1,d2−−√]
枚举并验证是否存在b即可。
坐标轴上必有4个点,而且四象限对称,所以规定x,y≥1
∵x2+y2=r2
∴y2=r2−x2
∴y2=(r−x)(r+x)
∴y=(r−x)(r+x)−−−−−−−−−−−√
令d=gcd(r−x,r+x),A=r−xd,B=r+xd
∴gcd(A,B)=1
∴y=dAB−−−√
∴AB为完全平方数
∵A≠B
∴A,B是完全平方数
令a=A−−√,b=B−−√,a<b
∴a2=r−xd,b2=r+xd
∴a2+b2=2rd
∵a,b是整数
∴d|2r
于是d∈[1,2r−−√],a∈[1,d2−−√]
枚举并验证是否存在b即可。
#include <cstdio> #include <cmath> #define FOR(i,j,k) for(i=j;i<=k;++i) typedef long long ll; ll gcd(ll a, ll b) { return !b ? a : gcd(b, a % b); } void chk(ll x, ll &ans) { ll sx = sqrt(x / 2), a2, b, b2, a; FOR(a,1,sx) { a2 = a * a; b2 = x - a2; b = sqrt(b2); if (b * b == b2 && gcd(a2, b2) == 1 && a2 != b2) ++ans; } } int main() { ll s2r, d, a, b, ans = 0, r; scanf("%I64d", &r); s2r = sqrt(2 * r); FOR(d,1,s2r) if ((2 * r) % d == 0) chk(d, ans), chk(2 * r / d, ans); printf("%I64d", ans * 4 + 4); return 0; }
1041: [HAOI2008]圆上的整点
Description
求一个给定的圆(x2+y2=r2),在圆周上有多少个点的坐标是整数。Input
rOutput
整点个数Sample Input
4Sample Output
4HINT
n≤2×109相关文章推荐