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

这道题刚看时,就明白暴力不能解决一切。要是r^2<=20亿,还可以sqrt循环,这样的话只能用数学方法了。

(嘘!本数学方法的关键一步是借鉴来的)

x^2+y^2=r^2

x^2=r^2-y^2

x^2=(r+y)(r-y)

我们设gcd(r+y,r-y)=d                                                                           //不知道什么是GCD?就是最大公因数 

再设m=(r+y)/d,n=(r-y)/d,易得gcd(m,n)=1

因为m*n=x^2/d/d,即m*n是平方数。

又因为m和n互质,所以它们分别是平方数,我们还可以设m=u^2,n=v^2 。

带回去,r+y=d*u^2,r-y=d*v^2。

两式相加,2r=d(u^2+v^2)

加到这里,这些字母都表示整数。

现在我们的目标达成了:即把r^2降成了r。

我们可以枚举sqrt(2r),再依次判断是否有整数的u,v,且它们是否互质 。

最后还要注意以下:首先,所得结果要乘4 ,比如(3,4),还有(3,-4),(-3,4),(-3,-4)。

当然,如果x=0或y=0是一定可以的。最后还要加上4,即(0,r),(r,0),(0,-r),(-r,0)。(呵呵,r不等于0,O(∩_∩)O~~)

以下附代码:

#include<cstdio>
#include<cmath>
using namespace std;
const double jing=0.00000001;
long gcd(long a,long b){if (a%b==0) return b;return gcd(b,a%b);}
long long ans=0,r,temp;long i,j;double t;
int main()
{
  scanf("%lld",&r);r*=2;
  for (i=1;i<=trunc(sqrt(r));i++)
    if (r%i==0)
    {
      temp=r/i;
      for (j=1;j<=trunc(sqrt(temp));j++)
      {
        t=trunc(sqrt(temp-j*j));if (t<=j) break;
        if (t*t+j*j==temp){if (gcd(j,t)==1) ans++;}
      }
      if (r/i==i) continue;temp=i;
      for (j=1;j<=trunc(sqrt(temp));j++)
      {
        t=trunc(sqrt(temp-j*j));if (t<=j) break;
        if (t*t+j*j==temp){if (gcd(j,t)==1) ans++;}
      }
    }
  ans*=4;ans+=4;printf("%ld",ans);
  return 0;
}

bzoj1041题解的更多相关文章

  1. 【BZOJ1041】[HAOI2008]圆上的整点

    [BZOJ1041][HAOI2008]圆上的整点 题面 bzoj 洛谷 题解 不妨设\(x>0,y>0\) \[ x^2+y^2=r^2\\ y^2=(x+r)(x-r) \] 设\(r ...

  2. 【BZOJ1041】圆上的整点(数论)

    [BZOJ1041]圆上的整点(数论) 题面 BZOJ 洛谷 题解 好神仙的题目啊. 安利一个视频,大概是第\(7\)到\(19\)分钟的样子 因为要质因数分解,所以复习了一下\(Pollard\_r ...

  3. HAOI2008题解

    又来写题解辣-然而并不太清楚题目排列情况...不管辣先写起来- T1:[bzoj1041] 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1 ...

  4. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  5. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  6. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  7. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  8. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  9. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

随机推荐

  1. UILabel图文混排显示图片和文字

    //传入文字 自动图片放在左边文字紧接着后排排布 -(void)setAttrDetailLabelWithTitle:(NSString *)title { NSMutableAttributedS ...

  2. JS 使用 splice() 对数组去重

    一 问题 有如下 js 数组 connect_clients,需要在去掉所有元素中 user_id, goods_id 这两者的值都相同的元素. [ { id: 'eff040fb-92bc-4f24 ...

  3. Java之反射代码演示说明

    还不存在的类–即我们需要使用反射来使用的类 Person类: package com.qf.demo4; public class Person { private String name; publ ...

  4. 前端单元测试框架-Mocha

    引言 随着前端工程化这一概念的产生,项目开发中前端的代码量可谓是'急剧上升',所以在这种情况下,我们如何才能保证代码的质量呢,对于框架,比如React.Vue,因为有自己的语法规则,及时每个开发人员的 ...

  5. python基础操作_方法(函数)

    #函数,方法#普通方法def hello(): print('hello')hello()#带形参的方法def hello1(name): print('hello%s'%name)hello1('布 ...

  6. 使用hashCode()和equals()方法 - Java

    在这篇文章中,我将指出我对hashCode()和equals()方法的理解.我将讨论它们的默认实现以及如何正确地覆盖它们.我还将使用Apache Commons包中的实用工具类来实现这些方法. has ...

  7. vue组件(Vue+webpack项目实战系列之三)

    组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.特别对于大型应用开发来说,尽量组件化,并且先造好轮子库,不要重复去写组件,这会显著提升项目 ...

  8. docker 私有仓库搭建

    知识基础:ubuntu系统安装,docker安装,了解docker的基础知识 下载镜像(如果下载2版本以上的需要配置ssl证书,这里先用0.9.1的演示) root@ubuntu:/# docker ...

  9. go语言获取变量的数据类型

    package main import "fmt" import "reflect"; var y string = "sdasd" fun ...

  10. php数组根据某键值,把相同键值的合并最终生成一个新的二维数组

    <?php $a=array( '0'=>array( 'id'=>'1', 'names'=>'jack', '0'=>'sendone' ), '1'=>arr ...