zoukankan      html  css  js  c++  java
  • bzoj1041[HAOI2008]圆上的整点

    bzoj1041[HAOI2008]圆上的整点

    题意:

    求一个给定半径的圆圆周上有多少个点的坐标是整数。r≤2*109

    题解:

    数学神题,本弱只能转载一下黄学长的题解

    首先x²+y²=r²,变形得y²=(r+x)*(r-x)。令d=gcd(r+x,r-x),则A=(r-x)/d,B=(r+x)/d,A,B互质,用a,b代入,有y²=d²*A*B,由于d²,y²为完全平方数,故A*B也为完全平方数。又因为A≠B,所以A和B都是完全平方数。设a²=A=(r-x)/d,b²=B=(r+x)/d,则a²+b²=2r/d,因此d为r的约数。

    有了上面的推理,那么实现的方法为:枚举d∈[1,sqrt(2R)],然后根据上述推理可知:必先判d是否为2R的一约数。此时d为2R的约数有两种情况:d=d或d=2R/d。

    第一种情况:d=2R/d。枚举a∈[1,sqrt(2R/d/2)] ,算出对应的b=sqrt(2R/d-a^2),检查是否此时的A,B满足:A≠B且A,B互质,若是就将答案加1

    第二种情况:d=d。枚举a∈[1,sqrt(d/2)],算出对应的b=sqrt(d-a^2),检查是否此时的A,B满足:A≠B且A,B互质 <根据上面的推理可知必需满足此条件>,若是就将答案加1

    因为这样只算出了第一象限的情况<上面枚举时均是从1开始枚举>,根据圆的对称性,其他象限的整点数与第一象限中的整点数相同,最后,在象限轴上的4个整点未算,加上即可,那么最后答案为ans=4*第一象限整点数+4

    代码:

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cmath>
     5 #define ll long long
     6 #define inc(i,j,k) for(ll i=j;i<=k;i++)
     7 using namespace std;
     8 
     9 ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
    10 int main(){
    11     ll n,ans=0; scanf("%lld",&n); n*=2;
    12     inc(i,1,(ll)sqrt(n))if(n%i==0){
    13         ll d=i;
    14         inc(j,1,(ll)sqrt(n/d/2)){
    15             ll b=n/d-j*j; if(sqrt(b)==(double)((ll)sqrt(b))&&gcd(j*j,b)==1&&j*j!=b)ans++;
    16         }
    17         if(d!=n/i){
    18             d=n/i;
    19             inc(j,1,(ll)sqrt(n/d/2)){
    20                 ll b=n/d-j*j; if(sqrt(b)==(double)((ll)sqrt(b))&&gcd(j*j,b)==1&&j*j!=b)ans++;
    21             }
    22         }
    23     }
    24     printf("%lld",ans*4+4); return 0;
    25 }

    20160615

  • 相关阅读:
    Kafka 消费者及消费者分区策略
    c++与c
    Exactly Once 语义
    如何在CentOS 8服务器上安装FreeIPA身份和授权解决方案?
    如何在Linux Mint 20上安装Wine
    如何在Ubuntu 20.04 LTS服务器上安装Wireguard
    如何在Ubuntu 20.04 LTS服务器上安装Apache JMeter
    如何在Linux服务器中使用SAR命令
    MongoDB是什么,它是如何工作的?
    如何在Ubuntu 20.04 LTS上安装SSH服务器
  • 原文地址:https://www.cnblogs.com/YuanZiming/p/5779854.html
Copyright © 2011-2022 走看看