\(\\\)

Description


给出一个整数 \(r\) ,求圆 \(x^2+y^2=r^2\) 上的整点数。

  • \(r\le 2\times 10^9\)

\(\\\)

Solution


神题。

可以注意到,坐标轴上共有四个整点,其余位置各个象限里整点数相同,所以我们只需要计算第一象限的答案。

首先有方程

\[x^2+y^2=r^2
\]

移项,得

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

设 \(d=gcd(r+y,r-y)\),有

\[x^2=\frac{r+y}{d}\times \frac{r-y}{d}\times d^2
\]

因为 \(x^2,d^2\) 均为完全平方数,所以 \(\frac{r+y}{d}\times \frac{r-y}{d}\) 是完全平方数。

根据 \(d\) 的定义,显然有 \((\frac{r+y}{d},\frac{r-y}{d})=1\)。

然而显然存在的是,两个不同的质数之积,或一个质数的平方和另一个质数的积都不是完全平方数。

所以 \(\frac{r+y}{d}, \frac{r-y}{d}\) 都是完全平方数。

我们设 \(a,b\) 分别满足:

\[a^2=\frac{r+y}{d},b^2= \frac{r-y}{d}
\]

那么有

\[a^2+b^2=\frac{r+y}{d}+\frac{r-y}{d}=\frac{2r}{d}
\]

解法出来了。

首先 \(\sqrt {2r}\) 枚举 \(2r\) 的因数,显然 \(d\) 不同的方案得到的点一定不同。

然后对于枚举的每一个 \(d\) ,枚举每一个可能的 \(a\) ,检验对应的 \(b\) 是否为整数,且满足互质即可。

注意交换 \(a,b\) 是一种情况,所以我们枚举 \(a\) 的范围在 \([1,\sqrt{\frac{2r}{d\times 2}}\ ]\) 里。

复杂度分析:

枚举约数 \(\sqrt{2r}\) ,对于每一个 \(d\) 再 \(\sqrt d\) 的枚举约数,验证用到 \(gcd\) 复杂度 \(log\) 。

总复杂度大概是 \((2r)^{\frac 34}log(2r)\) 级别的。

\(\\\)

Code


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define R register
using namespace std;
typedef long long ll; ll n,ans; ll gcd(ll x,ll y){return y?gcd(y,x%y):x;} int main(){
scanf("%lld",&n);
n<<=1;
ll lim=sqrt(n);
for(R ll d=1,lim1;d<=lim;++d)
if(n%d==0){
lim1=sqrt((n/d)/2);
for(R ll a=1,b;a<=lim1;++a){
b=sqrt((n/d)-a*a);
if(a==b) continue;
if(b*b!=(n/d)-a*a) continue;
if(gcd(a*a,b*b)!=1) continue;
++ans;
}
if(n/d!=d){
ll d1=n/d;
lim1=sqrt(d/2);
for(R ll a=1,b;a<=lim1;++a){
b=sqrt((n/d1)-a*a);
if(a==b) continue;
if(b*b!=(n/d1)-a*a) continue;
if(gcd(a*a,b*b)!=1) continue;
++ans;
}
}
}
printf("%lld\n",ans*4+4);
return 0;
}

最新文章

  1. 我为NET狂官方群福利贴:一些常用的工具:2016-08-01更新
  2. [LeetCode] Convex Polygon 凸多边形
  3. GDI画图,判断鼠标点击点在某一画好的多边形、矩形、图形里
  4. 记一次CSR上线及总结
  5. C# socket UDPの异步链接
  6. [笔记] Duke - 统计预测
  7. 关于Android与pc通信时中文乱码的分析和解决
  8. with ffmpeg to encode video for live streaming and for recording to files for on-demand playback
  9. Spring_Spring与DAO_Spring的Jdbc模板
  10. 学以致用三十四-----python2.0加载图片
  11. 出现System.web.mvc冲突的原因及解决方法CS0433
  12. Gradle环境变量的配置
  13. Mysql表中唯一编号的分配机制
  14. spark机器学习笔记01
  15. Ubuntu GNOME单击任务栏图标最小化设置
  16. IO(File)
  17. python数据库编程小应用
  18. NOIP2017滚粗记【下】
  19. requests设置Authorization
  20. redis 安装配置

热门文章

  1. Ubuntu 16.04安装JMeter测试工具
  2. guava cache学习
  3. centos7更新、更新、每天更新、每天自动更新
  4. APP漏洞自动化扫描专业评测报告
  5. 加入收藏BUG改善
  6. Replica Sets+Sharding方案之真枪实弹篇
  7. scikit-learn:3. Model selection and evaluation
  8. Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] D &quot;Or&quot; Game 枚举+前缀后缀
  9. 【bzoj2600】 [Ioi2011]ricehub
  10. 【bzoj1150】[CTSC2007]数据备份Backup