博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1041 [HAOI2008]圆上的整点
阅读量:5875 次
发布时间:2019-06-19

本文共 1344 字,大约阅读时间需要 4 分钟。

Description

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

Input

  只有一个正整数n,n<=2000 000 000

Output

  整点个数

Sample Input

4

Sample Output

4

题解

显然可以O(r)枚举x...

我们只考虑第一象限的点,最后乘四再加四(坐标轴上的点)。

考虑这个式子:

$$\begin{aligned}

x^2+y^2&=r^2\\
x^2&=r^2-y^2\\
x^2&=(r-y)(r+y)\end{aligned}$$

我们令$d = gcd(r+y, r-y), A = \frac{r-y}d, B = \frac{r+y}d$,则

$$x^2 = d^2 AB$$

又$gcd(A, B)=1$,所以$A, B$都是完全平方数。

再令$A = a^2, B = b^2$,则

$$a^2 = \frac{r-y}d$$

$$b^2 = \frac{r+y}d$$

两式相加得

$$a^2+b^2 = \frac{2r}d$$

又$a<b$,所以

$$a^2<\frac{r}d$$

那么我们只需枚举$d|2r$,再枚举$a<\sqrt{\frac{r}d}$,计算$B=\frac{2r}d - a^2$是否是完全平方数且与$A$互质即可。

具体,我们枚举$d\in[1, sqrt(2r)]$,判断是否有$d|2r$,如果是,那么对$d=d$和$d=\frac{2r}d$枚举a。

附代码(代码中$A,B$对应推导中的$a,b$):

#include 
#include
typedef long long LL;LL gcd(LL a, LL b) { while (b) { LL t = b; b = a % b; a = t; } return a;}LL r;inline bool check(LL d, LL A) { LL B = (LL)sqrt(2 * r / d - A * A); return A * A + B * B == 2 * r / d && gcd(A, B) == 1;}int main() { scanf("%lld", &r); LL ans = 0; for (LL d = 1; d * d <= 2 * r; ++d) if (!(2 * r % d)) { for (LL A = 1; A * A < r / d; ++A) ans += check(d, A); if (d * d != 2 * r) for (LL A = 1; A * A < d / 2; ++A) ans += check(2 * r / d, A); } printf("%lld\n", (ans + 1) * 4); return 0;}

  

转载于:https://www.cnblogs.com/y-clever/p/6986420.html

你可能感兴趣的文章
[转]PAC Manager: Ubuntu 上强大的 SSH 帐号管理工具,可取代 SecureCRT_Miracle_百度空间...
查看>>
顺序容器 (2)string类型操作
查看>>
转载:我最近的研究成果(IGeometry.Project and IGeometry.SpatialReference)
查看>>
提示框
查看>>
HDOJ1233 畅通工程之一(最小生成树-Kruscal)
查看>>
14Spring_AOP编程(AspectJ)_环绕通知
查看>>
PHP之打开文件
查看>>
iOS - OC SQLite 数据库存储
查看>>
PHP-mysqllib和mysqlnd
查看>>
Redis常用命令
查看>>
NeHe OpenGL教程 第三十五课:播放AVI
查看>>
Linux下ping命令、traceroute命令、tracert命令的使用
查看>>
js replace,正则截取字符串内容
查看>>
socket
查看>>
Highcharts使用表格数据绘制图表
查看>>
Thinkphp5笔记三:创建基类
查看>>
LNMP之编译安装PHP出现的问题
查看>>
hdu5373
查看>>
4.单链表的创建和建立
查看>>
testng生成报告 testng-xslt 美化测试报告
查看>>