bzoj1041: [HAOI2008]圆上的整点

链接

  http://www.lydsy.com/JudgeOnline/problem.php?id=1041

题解

  1A二连击。虽然是抄的题解
  显然

y2=(Rx)(R+x)

  令 d=gcd(Rx,R+x),A=Rxd,B=R+xd
  则 A<B
  代入原式
y2d2=AB

  显然 y2b2=(ab)2 是完全平方数
  因此 AB 也是完全平方数
  又因 gcd(A,B)=1 ,所以 A B分别是完全平方数
  令 A=a2,B=b2
  则
a2=Rxd,b2=R+xd

  
a2+b2=2Rd

  由前面易知 a<b ,所以 a2<Rd
  因此枚举 d|2R ,这个可以根号。
  对于一个 d|2R d ,对应两个式子
a2+b2=2Rda2+b2=d

  其中分别有 a2<Rd a2<d2
  枚举 a2 ,算出对应的 b ,如果b是完全平方数且 gcd(a,b)=1 ,那就找到了一对点,这对点可以倒着解回去, x=Ra2d , y=R2x2
  在 will7101 大佬的帮助下,用积分求出时间复杂度 O(n34)

代码

//数学 
#include <cstdio>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
ll R;
ll gcd(ll a, ll b){return !b?a:gcd(b,a%b);}
bool check(ll x)
{
    ll t=sqrt(x);
    return t*t==x;
}
int main()
{
    ll d, a, b, ans=0;
    scanf("%lld",&R);
    for(d=1;d*d<=2*R;d++)
    {
        if(2*R%d==0)
        {
            for(a=1;a*a<d/2;a++)
            {
                b=sqrt(d-a*a);
                if(a*a+b*b==d and gcd(a,b)==1)ans++;
            }
            for(a=1;a*a<R/d;a++)
            {
                b=sqrt(2*R/d-a*a);
                if(a*a+b*b==2*R/d and gcd(a,b)==1)ans++;
            }
        }
    }
    printf("%lld\n",ans*4+4);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值