题目大意

给出\(r\),求圆\(x^2+y^2=r^2\)上坐标均为整数的点数。\(n<=2,000,000,000\)

总体思路

我们看到这个数据大小,还是个数学题,想到这个的时间复杂度应当为\(O(\sqrt{r})\)。要达到这个效果,我们先要把\(r^2\)转化成\(r\),然后在\(\sqrt{r}\)的范围内枚举某个数。对于我们以前的经验,这枚举的“某个数”有:质因数分解、求因数等。这个题目好像跟质数的关系不大!那就是枚举因数喽!

以上的叙述就为我们以后的数学推导提供了目标。推导时,应当思维发散,大胆尝试,多尝试几种方法,最终筛选出以下数学推导得出解决办法的过程。

数学推导

经过移项等操作我们得到:

\[y^2=(r-x)(r+x)
\]

我们令\(d=\gcd(r+x,r-x)\),\(A=\frac{r-x}{d},B=\frac{r+x}{d}\)。这时我们发现:

\[A+B=\frac{2r}{d}
\]

这样,我们在\(\sqrt{2r}\)内枚举\(d\)(同时得到了\(d\)一个因数和\(\frac{2r}{d}\)一个因数),再在\(2r/d/2=\frac{r}{d}\)内枚举\(A\)和\(B\),看看有多少对\(A,B\)符合要求。这样我们已经把\(r\)降次了。

但是每枚举一个\(d\),都需要在\(\frac{r}{d}\)内枚举一遍\(A\),这使时间复杂度近似地变为线性,于我们要求的根号的复杂度仍然有距离。所以我们仍然要进一步优化。

推论1

对\(a,b,c\in Z\),若\(a^2=b^{2}c\),则\(\sqrt{c}\in Z\).

证明:\(c=(\frac{a}{b})^2, b^2|a^2\)

推论2

对\(a,b,c\in Z\),若\(a^2=bc\),且\(\gcd(b,c)=1\),则\(\sqrt{b}\in Z, \sqrt{c}\in Z\)

证明:因为\(b,c\)互质,故根据唯一分解定理,\(b,c\)的质因数中不存在交集。因为\(a\)是个完全平方数,组成它的所有质因数的次数都是偶数,而这些质因数都必须存在于\(b,c\)中,因此原命题成立。

这样,因为\(y^2=d^2AB\),故根据推论1,\(AB\)为完全平方数。因为\(\gcd(A,B)=1\),所以根据结论2,\(A,B\)为完全平方数。所以,为了保证枚举到的\(A\)都是完全平方数,令\(a=\sqrt{A},b=\sqrt{B}\),看看是否能同时满足存在整数\(b\)使得\(a^2+b^2=\frac{2r}{d}\)且\(\gcd(A=a^2,B=b^2)=1\)。这样\(a\)枚举的范围便是\(\sqrt\frac{r}{d}\),进一步加快了速度。

#include <cstdio>
#include <cmath>
using namespace std; #define ll long long ll Gcd(ll a, ll b)
{
return b ? Gcd(b, a%b) : a;
} void Find(ll r, ll d, ll &ans)
{
for (ll a = 1; a <= sqrt(r / d); a++)
{
ll b = sqrt(r * 2 / d - a * a);
if (a * a + b * b == r * 2 / d && a != b && Gcd(a * a, b * b) == 1) ans++;
}
} int main()
{
ll r, ans = 0;
scanf("%lld", &r);
for (ll d = 1; d * d <= r * 2; d++)
{
if (r * 2 % d == 0)
{
Find(r, d, ans);
if (d*d != r * 2)
Find(r, r * 2 / d, ans);
}
}
printf("%lld\n", ans * 4 + 4);
return 0;
}

luogu2508 [HAOI2008]圆上的整点的更多相关文章

  1. BZOJ 1041: [HAOI2008]圆上的整点

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3621  Solved: 1605[Submit][Sta ...

  2. bzoj 1041: [HAOI2008]圆上的整点 数学

    1041: [HAOI2008]圆上的整点 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

  3. bzoj 1041: [HAOI2008]圆上的整点 本原勾股數組

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 853[Submit][Stat ...

  4. 1041: [HAOI2008]圆上的整点

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4298  Solved: 1944[Submit][Sta ...

  5. BZOJ 1041: [HAOI2008]圆上的整点【数论,解方程】

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4210  Solved: 1908[Submit][Sta ...

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

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

  7. bzoj千题计划127:bzoj1041: [HAOI2008]圆上的整点

    http://www.lydsy.com/JudgeOnline/problem.php?id=1041 设 X>0 ,Y>0 X^2 + Y^2 = R^2 X^2 = R^2-Y^2 ...

  8. BZOJ1041 [HAOI2008]圆上的整点 【数学】

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4631  Solved: 2087 [Submit][S ...

  9. BZOJ(2) 1041: [HAOI2008]圆上的整点

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4966  Solved: 2258[Submit][Sta ...

随机推荐

  1. windows phone数据网络开发

    LINQ LINQ的全称是Language INtegrated Query,即语言集成查询.LINQ是一种查询语言,不仅可以对数字库进行查询,还可以对.net的数据集.数组.Xml文档等对象进行查询 ...

  2. DeltaFish 校园物资共享平台 第二次小组会议

    软工第二周小组会议 会议地点:三教讨论区 会议时间:9:00 ~ 10:00 与会人员:软工小组成员 请假人员:刘鼎乾 整理人:艾寅中 会议记录 一.小组分工 在经过一周的调研后,组长根据调研结果和对 ...

  3. 复习java基础第四天(集合:List、Map、Collections、Enumeration)

    一.List: List 代表一个元素有序.且可重复的集合,集合中的每个元素都有其对应的顺序索引 List 允许使用重复元素,可以通过索引来访问指定位置的集合元素. List 默认按元素的添加顺序设置 ...

  4. AI:PR的数学表示-传统方法PR

    前言: 接上一篇:AI:模式识别的数学表示 在图像处理PR领域,相对于ANN方法,其他的方法一般称为传统方法.在结构上,几乎所有的PR方法都是可解释的.且任一传统方法,在一定约束下,可以转换为SV近邻 ...

  5. Swift Pointer 使用指南

    Overview C Syntax Swift Syntax Note const Type * UnsafePointer<Type> 指针可变,指针指向的内存值不可变. Type * ...

  6. Fedora Atomic Host 使用中的几个坑

    做成U盘启动:必须用配套工具写U盘,否则安装时各种timeout Cockpit中文页面会导致登录后页面空白的bug,解决办法是更改浏览器首选语言 没有yum,无法下载网页浏览器w3m,Pydio c ...

  7. 如何将一个已有的项目托管到github或是码云上?git的配置

    场景一:已有的一个项目,要把它托管到Git上去,步骤和方法如下: 方法一: ①在工程的路径下 : git init 建一个裸仓库. ②远程仓库地址 :将本地的仓库和远程仓库关联 git remote ...

  8. Java同步的三种实现方式

    1.使用synchronized关键字修饰类或者代码块: 2.使用Volatile关键字修饰变量: 3.在类中加入重入锁 举例子:多个线程在处理一个共享变量的时候,就会出现线程安全问题.(相当于多个窗 ...

  9. 【第三课】kaggle案例分析三

    Evernote Export 比赛题目介绍 TalkingData是中国最大的第三方移动数据平台,移动设备用户日常的选择和行为用户画像.目前,TalkingData正在寻求每天在中国活跃的5亿移动设 ...

  10. es5、es6函数调用

    ES5中函数的4种调用 在ES5中函数内容的this指向和调用方法有关 1 函数调用模式 包括函数名()和匿名函数调用,this指向window function getSum() { console ...