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

    1041: [HAOI2008]圆上的整点

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 4298  Solved: 1944
    [Submit][Status][Discuss]

    Description

    求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。

    Input

    只有一个正整数n,n<=2000 000 000

    Output

    整点个数

    Sample Input

    4

    Sample Output

    4

    HINT

    /*
    * @Author: lyuc
    */
    
    /*
     题意:就是求有多少斜边为n的勾股数;
    
     思路:y*y=r*r-x*x
              =(r-x)*(r+x)
           令
            d=GCD(r-x,r+x)
           那么
            r-x=d*u*u
            r+x=d*v*v
            并且GCD(u,v)==1
            得到
            r=d*(u*u+v*v)/2
            y=d*d*u*u*v*v
            x=d*(v*v-u*u)
    
            这样枚举r的因子,在枚举u,注意x,y,r的范围就可以了
    
    */
    #include <bits/stdc++.h>
    
    #define LL long long 
    
    using namespace std;
    
    LL r;
    LL res;
    
    LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b); } 
    
    void cal(LL d){
        LL v;
        for(LL u=1;u<=sqrt(2*r*1.0/d);u++){
            v=(LL)sqrt( (2*r*1.0/d-u*u)*1.0 );
            if(gcd(u,v)==1&&u<=v&&d*(u*u+v*v)==2*r){
                res++;
            }
        }
    }
    
    int main(int argc, char *argv[])
    {
        //freopen("in.txt","r",stdin);
        res=0;
        scanf("%lld",&r);
        for(LL i=1;i<=sqrt(2*r*1.0);i++){
            if(2*r%i==0){
                if((LL)i*i==2*r){
                    cal(i);    
                }else{
                    cal(i);
                    cal(2*r/i);
                }
            }
        }
        printf("%lld
    ",res*4);
        return 0;
    }
  • 相关阅读:
    快速幂取模算法详解
    牛客网小白月赛5I区间(差分数组)
    多重背包模板
    hdu5791(DP)
    CodeForces
    最长上升子序列LIS(51nod1134)
    POJ1088(记忆搜索加dp)
    最长公共子序列LCS(POJ1458)
    Gym 100971J-Robots at Warehouse
    模板
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/7401729.html
Copyright © 2011-2022 走看看