2021.12.06 P2508 [HAOI2008]圆上的整点(数论+ π )
2021.12.06 P2508 [HAOI2008]圆上的整点(数论+ \(\pi\) )
https://www.luogu.com.cn/problem/P2508
题意:
求一个给定的圆 \((x^2+y^2=R^2)\) ,在圆周上有多少个点的坐标是整数。
分析:
第一步,咱把圆以横竖坐标轴为分界线分成四份儿,算出一份的整点坐标数*4就是结果。
恭喜你,40分到手。
第二步,先画一个 \(R=5\) 的圆,只关注第一象限,这里有四个整点坐标,分别为 \((0,5)\) , \((3,4)\) , \((4,3)\) , \((5,0)\) 。有没有发现这四个点关于直线 \(y=x\) 对称。更新一下算法,由 \(x^2+y^2=R^2\) 得: \(x=\sqrt{R^2-y^2}\) ,则当 \(x=y=\sqrt{R^2-y^2}\) 时,这个 \(\frac{1}{4}\) 圆在 \((x,y)\) 这个点上对称。所以咱只需要算 \(\frac{1}{8}\) 个圆就行啦,记得处理 \(x==y\) 且 \(x\) 与 \(y\) 均为整点的情况,这个时候在边界上的话要只算一次。
恭喜恭喜,60分就这么来了~
第三步,进入推公式大法 。
y^2=(R-x)*(R+x)\\
设u*d=R-x,v*d=R+x,d=\gcd(u,v)\\
则\gcd(u,v)=1\\
y^2=d^2*u*v\\
因为y^2、d^2均为完全平方数,则u*v为完全平方数\\
因为\gcd(u,v)=1,则可设u=s^2,v=t^2\\
y^2=d^2*s^2*t^2\\
则y=d*s*t\\
2*x=(R+x)-(R-x)\\
=d*(v-u)\\
=d*(t^2-s^2)\\
x=d*\frac{t^2-s^2}{2}
\]
好啦,100分到手~
挂上大家推荐的视频
https://www.bilibili.com/video/av12131743/
虽然我并没有看懂……
代码如下:
40pts:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
#define int long long
int r,ans;
signed main(){
IOS;
cin>>r;
int x=0,y=r;
for(;x<=r;x++){
while(x*x+y*y>r*r&&y>0)--y;
if(x*x+y*y==r*r)++ans;//,cout<<x<<" "<<y<<endl;
//cout<<x<<" "<<y<<endl;
}
cout<<ans*4-4;
return 0;
}
60pts:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
#define int long long
int r,ans;
signed main(){
IOS;
cin>>r;
int x=0,y=r;
int len=sqrt((double)(r*r)/2.0);
//cout<<r<<" "<<len<<endl;
for(;x<=len;x++){
while(x*x+y*y>r*r&&y>0)--y;
if(x*x+y*y==r*r)++ans;//,cout<<x<<" "<<y<<endl;
//cout<<x<<" "<<y<<endl;
}
ans*=2;
if(len*len*2==r*r)--ans;
cout<<ans*4-4;
return 0;
}
100pts:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
#define int long long
int R,ans;
inline int gcd(int x,int y){
return y==0?x:gcd(y,x%y);
}
inline void calc(int d){
for(int s=1;s*s<=R/d;s++){
int t=sqrt(R/d-s*s);
if(gcd(s,t)==1&&s*s+t*t==R/d){
int x=(t*t-s*s)/2*d;
int y=d*s*t;
if(x>0&&y>0&&x*x+y*y==R/2*R/2)ans+=2;
}
}
}
signed main(){
IOS;
cin>>R;R*=2;
for(int i=1;i*i<=R;i++)if(R%i==0){
calc(i);
if(R%i!=i)calc(R/i);
}
cout<<ans*4+4;
return 0;
}
2021.12.06 P2508 [HAOI2008]圆上的整点(数论+ π )的更多相关文章
- 洛谷P2508 [HAOI2008]圆上的整点
题目描述 求一个给定的圆$ (x^2+y^2=r^2) $,在圆周上有多少个点的坐标是整数. 输入格式 \(r\) 输出格式 整点个数 输入输出样例 输入 4 输出 4 说明/提示 \(n\le 20 ...
- P2508 [HAOI2008]圆上的整点
题目描述 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. 输入输出格式 输入格式: r 输出格式: 整点个数 输入输出样例 输入样例#1: 复制 4 输出样例#1: 复制 ...
- [bzoj1041] [洛谷P2508] [HAOI2008] 圆上的整点
Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...
- luogu P2508 [HAOI2008]圆上的整点
传送门 推荐去bzoj看个视频了解一下 不要妄想视频直接告诉你题解 但是视频告诉了你后面要用的东西 首先我们要求的是\(x^2+y^2=n^2(x,y\in Z)\)的\((x,y)\)对数,可以转化 ...
- BZOJ1041:[HAOI2008]圆上的整点(数论)
Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...
- 【bzoj1041】[HAOI2008]圆上的整点 数论
题目描述 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. 输入 只有一个正整数n,n<=2000 000 000 输出 整点个数 样例输入 4 样例输出 4 题解 数 ...
- 2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP)
2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP) https://www.luogu.com.cn/problem/P1450 题意: 共有 44 种硬币.面 ...
- 2021.12.06 P2511 [HAOI2008]木棍分割(动态规划)
2021.12.06 P2511 [HAOI2008]木棍分割(动态规划) https://www.luogu.com.cn/problem/P2511 题意: 有n根木棍, 第i根木棍的长度为 \( ...
- BZOJ 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3621 Solved: 1605[Submit][Sta ...
随机推荐
- pygame.update()与pygame.flip()的区别
flip函数将重新绘制整个屏幕对应的窗口. update函数仅仅重新绘制窗口中有变化的区域. 如果仅仅是几个物体在移动,那么他只重绘其中移动的部分,没有变化的部分,并不进行重绘.update比flip ...
- 【Ansible】ansible容器学习环境搭建
想要学习ansible,只有一个节点肯定是不行的,而搭建虚拟机又是一件非常费时费力费资源的事情,所以通过docker 快速搭建一个容器学习环境是一个不错的选择 1. 了解ansible部署 1.1 需 ...
- 通过Kuberneters Goat学习K8S安全(上)
实验环境:https://katacoda.com/madhuakula/scenarios/kubernetes-goat 0x1.敏感信息泄露利用 第一关是代码泄露利用,打开网站后显示: 告诉我们 ...
- 【ASP.NET Core】MVC模型绑定:自定义InputFormatter读取CSV内容
在上一篇文章中,老周介绍了用自定义 ModelBinder 的方式实现一个 API(或MVC操作方法)可以同时支持 JSON 格式和 Form-data 格式的数据正文.今天该轮到 InputForm ...
- 【算法】两个list合并
转载博客地址 http://blog.sina.com.cn/s/blog_5da93c8f0101fdrp.html 有两个ArrayList,分别为list1和list2,分析这两个list后生成 ...
- 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要 ...
- 用 Java 写一个单例类?
饿汉式单例 public class Singleton { private Singleton(){} private static Singleton instance = new Singlet ...
- 解释 Spring 框架中 bean 的生命周期?
Spring 容器 从 XML 文件中读取 bean 的定义,并实例化 bean. Spring 根据 bean 的定义填充所有的属性. 如果 bean 实现了 BeanNameAware 接口,Sp ...
- Memcached 服务分布式集群如何实现?
特殊说明:Memcached 集群和 web 服务集群是不一样的,所有 Memcached 的数据总和才是数据库的数据.每台 Memcached 都是部分数据.(一台 memcached 的数据,就是 ...
- CPF 使用C#的Native AOT 发布程序
微软已经将AOT的包移到Nuget了,之前是在实验测试服务器上的.并且由之前的alpha版本改成了preview版本. C#的开发效率,接近C++的运行效率,而且可以防止反编译,可以支持大部分反射功能 ...