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 ...
随机推荐
- python练习册 每天一个小程序 第0001题
1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生 ...
- VS Code Java 3月更新|代码补全、Maven 以及 Java 插件预览版本新升级!
Nick Zhu Senior Program Manager, Developer Division at Microsoft 大家好,欢迎来到 Visual Studio Code Java 的 ...
- FOC软件中要处理的问题
1. 电流采样时间及通道 FOC需要通过采集相电流来进行控制,采样时间及通道极为关键,在二或三电阻采样方案中,采用如下方式: 在1.6扇区,B.C为采样通道: 在2.3扇区,A.C为采样通道: 在4. ...
- [WC2016]挑战NPC(一般图最大匹配)
[WC2016]挑战NPC(一般图最大匹配) Luogu 题解时间 思路十分有趣. 考虑一个筐只有不多于一个球才有1的贡献代表什么. 很明显等效于有至少两个位置没有被匹配时有1的贡献. 进而可以构造如 ...
- Sting -- byte[]互转
1.String -->byte[] String str = "中国"; byte[] bys = str.getBytes(); Arrays.toString(bys) ...
- vue渐进式?
小到可以只使用核心功能,比如单文件组件作为一部分嵌入:大到使用整个工程,vue init webpack my-project来构建项目:VUE的核心库及其生态系统也可以满足你的各式需求(core+v ...
- 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要 ...
- Dubbo 服务降级,失败重试怎么做?
可以通过 dubbo:reference 中设置 mock="return null".mock 的值也可以修 改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名 ...
- JavaScript的访问器
一.访问器属性: 1.Configurable:表示能否通过delete删除属性,从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性.对于直接在对象上定义的属性,这个特性的默认值为tr ...
- 哪一个List实现了最快插入?
LinkedList和ArrayList是另个不同变量列表的实现.ArrayList的优势在于动态的增长数组,非常适合初始时总长度未知的情况下使用.LinkedList的优势在于在中间位置插入和删除操 ...