【BZOJ】【1041】【HAOI2008】圆周上的点
数学
orz hzwer
完全不会做……
很纠结啊,如果将来再遇到这种题,还是很难下手啊……
引用题解:
【分析】:
样例图示:
首先,最暴力的算法显而易见:枚举x轴上的每个点,带入圆的方程,检查是否算出的值是否为整点,这样的枚举量为2*N,显然过不了全点。
然后想数学方法。
有了上面的推理,那么实现的方法为:
枚举d∈[1,sqrt(2R)],然后根据上述推理可知:必先判d是否为2R的一约数。
此时d为2R的约数有两种情况:d=d或d=2R/d。
第一种情况:d=2R/d。枚举a∈[1,sqrt(2R/2d)] <由2*a*a < 2*R/d转变来>,算出对应的b=sqrt(2R/d-a^2),检查是否此时的A,B满足:A≠B且A,B互质 <根据上面的推理可知必需满足此条件>,若是就将答案加1
第二种情况:d=d。枚举a∈[1,sqrt(d/2)] <由2*a*a < d转变来>,算出对应的b=sqrt(d-a^2),检查是否此时的A,B满足:A≠B且A,B互质 <根据上面的推理可知必需满足此条件>,若是就将答案加1
因为这样只算出了第一象限的情况<上面枚举时均是从1开始枚举>,根据圆的对称性,其他象限的整点数与第一象限中的整点数相同,最后,在象限轴上的4个整点未算,加上即可,那么最后答案为ans=4*第一象限整点数+4
【时间复杂度分析】:
枚举d:O(sqrt(2R)),然后两次枚举a:O(sqrt(d/2))+O(sqrt(R/d)),求最大公约数:O(logN)
1 /************************************************************** 2 Problem: 1041 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:192 ms 7 Memory:816 kb 8 ****************************************************************/ 9 10 //BZOJ 1000 11 #include<cmath> 12 #include<cstdio> 13 using namespace std; 14 typedef long long LL; 15 typedef double lf; 16 /******************tamplate*********************/ 17 LL r,ans; 18 LL gcd(LL x,LL y){return y?gcd(y,x%y):x;} 19 bool check(LL y,lf x){ 20 if (x==floor(x)){ 21 LL x1=x; 22 if (gcd(x1*x1,y*y)==1 && x1*x1!=y*y) 23 return 1; 24 } 25 return false; 26 } 27 int main(){ 28 scanf("%lld",&r); 29 for(LL d=1;d<=sqrt(2*r);d++) 30 if (2*r%d==0){ 31 for(LL a=1;a<=(LL)sqrt(2*r/(2*d));a++){ 32 lf b=sqrt((2*r)/d-a*a); 33 if (check(a,b))ans++; 34 } 35 if (d!=2*r/d){ 36 for(LL a=1;a<=(LL)sqrt(d/2);a++){ 37 lf b=sqrt(d-a*a); 38 if (check(a,b))ans++; 39 } 40 } 41 } 42 printf("%lld\n",ans*4+4); 43 return 0; 44 }
View Code
1041: [HAOI2008]圆上的整点
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2376 Solved: 1019
[Submit][Status][Discuss]
Description
求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。
Input
r
Output
整点个数
Sample Input
Sample Output
HINT
n<=2000 000 000
Source
[Submit][Status][Discuss]
转载于:https://www.cnblogs.com/Tunix/p/4428004.html
【BZOJ】【1041】【HAOI2008】圆周上的点相关推荐
- bzoj 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2838 Solved: 1238 [Submit][S ...
- 【BZOJ 1041】圆上整点
1.题目链接.给定半径,找一下这个圆上有多少个整点.其实也就是格点. 2.这个题目其实是比较有意思的,做法也有很多种.比较常规的解法是: 到这里其实就好办了,因为x是一个平方数,A,B互质,所以A,B ...
- 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 ...
- BZOJ 1041 圆上的整点 数学
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1041 题目大意: 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是 ...
- [BZOJ 1041] 圆上的整点
Description 求一个给定的圆( x2+y2=r2 x 2 + y 2 = r 2 x^2+y^2=r^2),在圆周上有多少个点的坐标是整数 Input 只有一个正整数 n n n,n≤200 ...
- BZOJ1041:[HAOI2008]圆上的整点(数论)
Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...
- 将一根木棍分成三段,求这三段构成三角形的概率 和 在一圆周上任意取三个点构成锐角三角形的概率是多少
将一根木棍分成三段,求这三段构成三角形的概率 设线段长度为a,任意分成三段长分别为x,y和a-x-y,显然有x>0,y>0,a-x-y>0,将这三个约束条件画到(x,y)二维平面坐标 ...
- 角度转弧度根据弧度计算圆周上点的坐标的方法
#define AngleToRadian(angle) (M_PI/180.0f)*angle 以正东面为0度起点计算指定角度所对应的圆周上的点的坐标: float radian = AngleTo ...
- 圆周上任意取三点组成直角三角形的概率为0
圆周上任意取三点组成直角三角形的概率为0! 不失一般性,我们在一个单位圆上做分割,下图中两点之间的弧长用对应的字母表示: 这时,根据圆周角与所夹弧长的关系可以把该问题转化为几何概型: 三角形为锐角三角 ...
最新文章
- linux 系统监控和进程管理
- 微信8.0之后,又悄悄上线新功能:别人“抢不到”的红包!赶紧看看灰度到你了没?...
- 1090 危险品装箱 (25 分)
- 8.Java格式化输出
- Python基础之二进制
- Rsync:一个很实用的文件同步命令
- Android NDK开发: 通过C/C++调用第三方so库
- linux新建用户切换后显示-bash-4.1$(转载)
- 拓端tecdat|R语言t检验和非正态性的鲁棒性
- 放大你的Rstudio窗口字体
- 公安装备效能评估系统软件
- Ubuntu1604 在startup 中添加开机自启动
- fn1-call-call-fn2-面试题
- celeste第二章_魂源蔚蓝-第二章:源士的力量体系-爱阅小说网
- PCBA水洗流程和工艺原理
- 用javascript实现九九乘法口诀表
- 云数据库RDS是什么
- 怎样查看自己的wifi密码?
- 【计算机原理与接口技术(UNIX)⑱】——并行 I/O 接口 [ 芯片8255A ]
- 爬虫豆瓣读书top250,保存为本地csv文件,可用excel查看(具体步骤和容易遇到的坑)
热门文章
- java对象的序列化机制详解
- div+css 你知道多少?值得一看
- matlab sort对矩阵某一维进行排序并记录之前索引
- ubuntu 常用快捷键、常用命令
- 用RAII技术管理资源及其泛型实现
- mysql 赋给用户权限 grant all privileges on
- nohup 命令 用途:不挂断地运行命令
- jsoup 获取html中body内容_Java 进阶 利用Jsoup获取HTML页面的各分页中的标题信息...
- linux操作系统2试题,RedHat Linux 9.0 操作系统测试题2
- 多线程 调用 axis 报错_java笔记录(三、多线程)