zoukankan      html  css  js  c++  java
  • BZOJ 1041 数学

    思路:

    $x^2+y^2=r^2$
    $y=sqrt{(r+x)(r-x)}$
    令$ d=gcd(r+x,r-x)$
    设A=$(r-x)/d$   $B=(r+x)/d$
    则$gcd(A,B)=1$
    $y^2=d^2*A*B$
    ∵$d、y$为完全平方数、$gcd(A,B)=1$、且$A!=B$(在坐标轴上的最后算)
    ∴$A、B$为完全平方数
    设$a^2=(r+x)/d  b^2=(r-x)/d$
    则$a^2+b^2=2r/d$
    即d是2r的约数
    那我们就$1到sqrt{2r}$枚举约数
    再枚举a (从$sqrt{r/d}$枚举到$sqrt{2r/d}$) $a^2=(r+x)/d$
    $b^2=(r-x)/d=2r/d-a^2$
    判断一下$gcd(a^2,b^2)$是不是等于1且$a!=b!=0$且$sqrt{b}^2==b$
    最后答案就是ans*4(四个象限)+4(坐标轴上的)

    //By SiriusRen
    #include <cmath>
    #include <cstdio>
    using namespace std;
    #define int long long
    int r,ans;
    int gcd(int x,int y){return y?gcd(y,x%y):x;}
    void solve(int d){
        int lst=sqrt(2*r/d),fst=sqrt(r/d);
        if(fst*fst<r/d)fst++;
        for(int a=fst;a<=lst;a++){
            int sqrb=2*r/d-a*a,b=sqrt(sqrb); 
            if(a&&b&&b*b==sqrb&&a!=b&&gcd(a*a,sqrb)==1)ans++;
        }
    }
    signed main(){
        scanf("%lld",&r);
        int sqr=sqrt(2*r);
        for(int d=1;d<=sqr;d++)if((2*r)%d==0)solve(d),solve(2*r/d);
        printf("%lld
    ",ans*4+4);
    }
  • 相关阅读:
    js-js系列-数据类型-概念
    js-基础总结3
    js-基础总结2
    js-基础总结1
    js-面试题
    webpack-模块化
    js-对象常用方法
    js-事件冒泡-事件捕获-事件委托
    js-call aplly bind2
    aioxs实现token无感刷新
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6535061.html
Copyright © 2011-2022 走看看