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

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

题意:求圆O: x^2+y^2=r^2(r>0)上坐标为整点的个数

  移向项 y^2=r^2-x^2=(r-x)(r+x)

  设d=gcd(r-x,r+x)得 y^2=(d^2)*(r-x)/d*(r+x)/d

  设A=(r-x)/d,B=(r+x)/d,得A+B=2*r/d

  因为A,B为整数,所以d为2*r的因数,所以在区间[1,sqrt(2*r)]

  又因为y^2和d^2均为完全平方数,AB互质,所以AB均为完全平方数

  设A=a^2,B=b^2

  2*r/d=a^2+b^2>=2*a^2>=2*a

  再在区间[1,sqrt(r/d)]和区间[1,sqrt(d/2)]上枚举a,算出b,判断是否互质即可

1 #include
2 using namespace std; 3 4 typedef long long i64; 5 i64 gcd(i64 x,i64 y){ 6 return y?gcd(y,x%y):x; 7 } 8 bool check(i64 a,double b){ 9 i64 bb=(long long)b;10 if(bb!=b)return false;11 i64 A=a*a,B=bb*bb;12 return A!=B&&gcd(A,B)==1;13 }14 int main(){15 i64 R;16 scanf("%lld",&R);17 i64 lim=sqrt(2*R);18 int ans=0;19 for(i64 d=1;d<=lim;d++){20 if(2*R%d==0){21 i64 up=sqrt(R/d);22 for(i64 a=1;a<=up;a++){23 double b=sqrt(2*R/d-a*a);24 if(check(a,b))ans++;25 }26 if(2*R/d!=d){27 up=sqrt(d/2);28 for(i64 a=1;a<=up;a++){29 double b=sqrt(d-a*a);30 if(check(a,b))ans++;31 }32 }33 }34 }35 printf("%d\n",ans*4+4);36 return 0;37 }
View Code

 

转载于:https://www.cnblogs.com/Ngshily/p/5057755.html

你可能感兴趣的文章
pip不是内部或外部命令也不是可运行的程序或批处理文件的问题
查看>>
Xcode 9,真机测试,App installation failed
查看>>
zabbix-mysql迁移分离
查看>>
jQuery调用WCF 说明
查看>>
算法第5章作业
查看>>
7.9 练习
查看>>
基于ArcGIS JS API的在线专题地图实现
查看>>
learnByWork
查看>>
Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法
查看>>
lua 函数
查看>>
Git的基本命令
查看>>
四平方和
查看>>
第十八周 12.27-1.2
查看>>
Linux平台下java程序员的基本功(七)
查看>>
C# IP地址字符串和数值转换
查看>>
TCHAR和CHAR类型的互转
查看>>
Java Collection framework
查看>>
[Deep Learning] 神经网络基础【转】
查看>>
ActiveMQ Queue vs Topic vs VirtualTopic
查看>>
ShareObject 数据存储
查看>>