题目大意

给出\(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. 5.13Junit单元测试-反射-注解

    一.Junit单元测试 * 测试分类: 1.黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值 2.白盒测试:需要些代码的.关注程序具体的执行流程 Junit使用:白盒测试 步骤: 1.定义 ...

  2. SDOI 2018 round2游记

    Day 0 早上起来从北京到济南 住宿环境不错 不过比赛环境怎么这么low啊 而且我在最偏僻的考场中最偏僻的角落里 身边居然是个妹子?! Day1 7:40到的考试地点 发现诸位大佬已经打完板子了or ...

  3. informix 通过ADO或ODBC连接提取数据时出现中文乱码的解决方法

    最近在做一个项目,是对INFORMIX数据库的数据进行大数据分析,INFORMIX数据库数据有上亿条,没有linux的Root权限和informix数据的生产权限,只能读取.客户要求结果显示在内网wi ...

  4. 如何在Eclipse中创建Web服务器

    使用Eclipse开发Web项目时,需要先配置Web服务器,如果已经配置好Web服务器,就不需要再重新配置了.也就是说,本节的内容不是开发每个项目时,都必须经过的步骤.创建Web服务器的具体步骤如下: ...

  5. 常用SQL函数

    —————常用SQL函数(实例简述)————— 数据库环境:DB2数据库: 执行工具:Toad for  DB2 1.转字符串:to_char() 日期类型:to_char(birthday,'yyy ...

  6. VHDL之code structure

     1 VHDL units VHDL code is composed of at least 3 fundamental sections: 1) LIBRARY declarations: Con ...

  7. Java_Web之分层架构

    当我们把业务处理的代码与JSP代码混在一起,不易于阅读,不易于代码维护,这就需要分层. 分层模式 1.分层模式是最常见的一种架构模式 2.分层模式是很多架构模式的基础 分层 将解决方案的组件分隔到不同 ...

  8. 用SQL Server验证用户名和密码

    用SQL Server验证用户名和密码,从页面输入的用户名和密码与数据库的用户名和密码进行匹配,正确则登入,错误则提醒. <form action="index.jsp" m ...

  9. sql server 游标fetch简单用法

    //遍历tmp_check的年份和月份 DECLARE @year ) DECLARE @month ) DECLARE cur CURSOR FOR SELECT nf,yf FROM tmp_ch ...

  10. 【sqli-labs】 less37 POST- Bypass MYSQL_real_escape_string (POST型绕过MYSQL_real_escape_string的注入)

    POST版本的less36 uname=1&passwd=1%df' or 1#