luogu2508 [HAOI2008]圆上的整点
题目大意
给出\(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 longll 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;
}
转载于:https://www.cnblogs.com/headboy2002/p/8955118.html
luogu2508 [HAOI2008]圆上的整点相关推荐
- bzoj 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2838 Solved: 1238 [Submit][S ...
- 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 ...
- BZOJ1041:[HAOI2008]圆上的整点(数论)
Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...
- bzoj1041 [HAOI2008]圆上的整点 gcd
这个题非常恶心,因为条件很少,要求也很少,看起来没有任何特殊的性质 所以只能往约数.gcd上靠 然后就是 x^2=r^2-y^2=(r-y)(r+y) 设A=r-y, B=r+y 由于A*B是完全平方 ...
- 【HAOI2008】【BZOJ1041】圆上的整点
Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input r Output 整点个数 Sample Input 4 Sample Output 4 ...
- 【codevs1867】【Tyvj3508】【BZOJ1041】圆上的整点,数学乱搞
传送门1 传送门2 传送门3 写在前面:乱搞数学-- 思路: 原博文 有了上面的推理,那么实现的方法为: 枚举d∈[1,sqrt(2R)],然后根据上述推理可知:必先判d是否为2R的一约数. 此时d为 ...
- [BZOJ 1041] 圆上的整点
Description 求一个给定的圆( x2+y2=r2 x 2 + y 2 = r 2 x^2+y^2=r^2),在圆周上有多少个点的坐标是整数 Input 只有一个正整数 n n n,n≤200 ...
- BZOJ 1041 圆上的整点 数学
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1041 题目大意: 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是 ...
- 2019 ICPC 上海站网络赛 K.Peekaboo (圆上整点)
https://nanti.jisuanke.com/t/41421 题意:给定平面上两个点到原点之间的距离aaa和bbb以及这两点之间的距离ccc,且这两点的坐标均是整数,求该两点可能的坐标,按字典 ...
- BZOJ 4544: 椭圆上的整点
Sol 数学. 跟圆上的整点一样...TA写了个积性函数的算法...以后再说吧... \(x^2+3y^2=r^2\) \(3y^2=r^2-x^2\) \(3y^2=(r-x)(r+x)\) \(y ...
最新文章
- 轻断食是一种科学的减肥方法吗?
- Aooms_基于SpringCloud的微服务基础开发平台实战_002_工程构建
- gazebo卡了_ardupilot gazebo打开卡死解决办法
- feign 能干什么:
- Nginx 中 nginx.conf 详解
- linux 拷机软件,拷机软件跑起来,OS X平台下OpenGL初体验
- python 服务端判断客户端异常断开
- Java编程:KMP算法
- 正则表达式:Javascript
- Visual Studio 开源控件扩展 NuGet 常用组件安装命令
- 文本分类概述(nlp)
- 中继 并发量_潮流UCM6102 IP PBX 支持500门分机 双外线 30个并发数
- Excel2JSON Excel转JSON Excel另存为JSON的技巧
- 计算机文件右击怎么显示打开方式,修复鼠标右键点击文件打开方式在win10中没有反应...
- SAP-MM知识精解-STO公司内的库存转储订单(01)-不带交货单配置及操作
- 【转】博弈论中的几个经典问题
- 一加5t刷android p,一加5T刷机包
- (纯故事)我简单写几篇,就这一次
- 天猫实时销量接口用于商品数据分析,超详细的接口介绍
- Engineering Dynamics 3 --- 转动惯量