题目大意

给出\(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. JavaScript异步加载方案

    (1) defer,只支持IE defer属性的定义和用法(我摘自w3school网站) defer 属性规定是否对脚本执行进行延迟,直到页面加载为止. 有的 javascript 脚本 docume ...

  2. 笔记 — 动画效果(Css3)

    /** * animation-name: 调用 @keyframes 所定义的动画 * animation-duration: 动画周期所花费的时间长度 * animation-timing-fun ...

  3. ViewPager循环滚动

    一.先写个适配器 public class MyPagerAdapter extends PagerAdapter { /** * 上下文 */ private Context context; /* ...

  4. 设计包含min()函数的栈

    题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:这是去年google的一道面试题. 我看到这道题目时,第一反应 ...

  5. C++版的LLC代码

    图像稀疏编码总结:LLC和SCSPM,文章对稀疏编码讲解非常详细. <Locality-constrained Linear Coding for Image Classification> ...

  6. 国外AI界牛人主页 及资源链接

    感觉 好博客要收集,还是贴在自己空间里难忘!!! 原文链接:http://blog.csdn.net/hitwengqi/article/details/7907366 http://people.c ...

  7. 数据库Day3之SQL Server 触发器

    最近在做一个人事管理系统写了几个简单的触发器 1.在删除员工信息表中员工信息时结果区提示被删除员工信息 create trigger teston 员工信息表after deleteasselect ...

  8. Scala语言学习笔记——方法、函数及异常

    1.Scala 方法及函数区别 ① Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法 ② Scal ...

  9. S-HR系统流程

  10. eas快捷键

    ctrl+shift+c  获取分录行的id ctrl+alt+[  获取任意界面操作的信息