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 ...
随机推荐
- .Net Core EF的使用步骤
EF Core--Code First (代码优先) 第一步 安装 NuGet包 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore ...
- 学习SpringMVC必知必会(7)~springmvc的数据校验、表单标签、文件上传和下载
输入校验是 Web 开发任务之一,在 SpringMVC 中有两种方式可以实现,分别是使用 Spring 自带的验证 框架和使用 JSR 303 实现, 也称之为 spring-validator 和 ...
- 5分钟了解二叉树之LeetCode里的二叉树
有读者反馈,现在谁不是为了找工作才学的数据结构,确实很有道理,是我肤浅了.所以为了满足大家的需求,这里总结下LeetCode里的数据结构.对于我们这种职场老人来说,刷LeetCode会遇到个很尴尬的问 ...
- 【论文阅读】CVPR2021: MP3: A Unified Model to Map, Perceive, Predict and Plan
Sensor/组织: Uber Status: Reading Summary: 非常棒!端到端输出map中间态 一种建图 感知 预测 规划的通用框架 Type: CVPR Year: 2021 引用 ...
- Prometheusbu部署使用-1
Prometheus+grafana部署使用 主机列表: 192.168.161.130 : Prometheus 192.168.161.128 : node-1 192.168.161.129 : ...
- Arthas之类操作
Arthas之类操作 1. classLoader 查询当前JVM中存在的classloader classloader name numberOfInstances loadedCountTotal ...
- 实现一个函数功能:sum(1,2,3,4..n)转化为 sum(1)(2)(3)(4)…(n)?
// 使用柯里化 + 递归function curry ( fn ) { var c = (...arg) => (fn.length === arg.length) ? ...
- 什么是原子操作?在 Java Concurrency API 中有哪些原 子类(atomic classes)?
原子操作(atomic operation)意为"不可被中断的一个或一系列操作" . 处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作. 在 Java 中可以通 ...
- 如何在 Mac 上强制退出 App
同时按住三个按键:Option.Command 和 Esc (Escape) 键.或者,从屏幕左上角的苹果菜单 中选取"强制退出".(这类似于在 PC 上按下 Control- ...
- Java BlockingQueue是什么?
Java BlockingQueue是一个并发集合util包的一部分.BlockingQueue队列是一种支持操作,它等待元素变得可用时来检索,同样等待空间可用时来存储元素.