卧薪尝胆,厚积薄发。
HAOI2008 圆上的整点
Date: Mon Nov 05 16:40:55 CST 2018 In Category: NoCategory

Description:

给出一个整数 $r$ ,求圆 $x^2+y^2=r^2$ 上的整点数。
$1\leqslant r\leqslant 2\times10^9$

Solution:

这种题,肯定是推一下式子然后暴力枚举某个东西判断合法的。 $$ x^2=r^2-y^2=(r+y)(r-y) $$ 设 $d=\gcd(r+y,r-y)$ : $$ x^2=\frac{r+y}d\times \frac{r-y}d\times d^2 $$ 因为 $x^2,d^2$ 均为完全平方数,且 $\frac{r+y}d,\frac{r-y}d$ 互质,所以他们也必须都是完全平方数,设 $a^2=\frac{r+y}d,b^2=\frac{r-y}d$ : $$ a^2+b^2=\frac{r+y}d+\frac{r-y}d=\frac{2r}d $$ 然后我们可以 $O(\sqrt{2r})$ 枚举 $2r$ 的约数 $d$ ,再枚举 $a$ ,判断 $\frac{2r}d-a^2$ 是否是平方数,以及 $a^2$ 和 $b^2$ 是否互质。

Code:


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cctype>
#include<cstring>
using namespace std;
typedef long long ll;
ll r;
ll fac[1000000],tot = 0;
ll gcd(ll a,ll b){return (b == 0 ? a : gcd(b,a % b));}
int main()
{
scanf("%lld",&r);
for(ll d = 1;d * d <= 2 * r;++d)
{
if((2 * r % d) == 0)
{
fac[++tot] = d;
if(d * d != 2 * r)fac[++tot] = 2 * r / d;
}
}
ll ans = 0;
for(ll i = 1;i <= tot;++i)
{
ll d = fac[i];
for(ll a = 1;a * a <= 2 * r / d;++a)
{
ll b2 = 2 * r / d - a * a;
if((ll)sqrt(b2) * sqrt(b2) == b2 && gcd(b2,a * a) == 1)
{
if(d * a * sqrt(b2) >= 0 && r - b2 * d >= 0)
{
++ans;
}
}
}
}
cout << (ans - 1) * 4 << endl;
return 0;
}
In tag: 玄学
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡