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^2-x^2\\
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]圆上的整点(数论+ π )的更多相关文章

  1. 洛谷P2508 [HAOI2008]圆上的整点

    题目描述 求一个给定的圆$ (x^2+y^2=r^2) $,在圆周上有多少个点的坐标是整数. 输入格式 \(r\) 输出格式 整点个数 输入输出样例 输入 4 输出 4 说明/提示 \(n\le 20 ...

  2. P2508 [HAOI2008]圆上的整点

    题目描述 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. 输入输出格式 输入格式: r 输出格式: 整点个数 输入输出样例 输入样例#1: 复制 4 输出样例#1: 复制 ...

  3. [bzoj1041] [洛谷P2508] [HAOI2008] 圆上的整点

    Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...

  4. luogu P2508 [HAOI2008]圆上的整点

    传送门 推荐去bzoj看个视频了解一下 不要妄想视频直接告诉你题解 但是视频告诉了你后面要用的东西 首先我们要求的是\(x^2+y^2=n^2(x,y\in Z)\)的\((x,y)\)对数,可以转化 ...

  5. BZOJ1041:[HAOI2008]圆上的整点(数论)

    Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...

  6. 【bzoj1041】[HAOI2008]圆上的整点 数论

    题目描述 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. 输入 只有一个正整数n,n<=2000 000 000 输出 整点个数 样例输入 4 样例输出 4 题解 数 ...

  7. 2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP)

    2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP) https://www.luogu.com.cn/problem/P1450 题意: 共有 44 种硬币.面 ...

  8. 2021.12.06 P2511 [HAOI2008]木棍分割(动态规划)

    2021.12.06 P2511 [HAOI2008]木棍分割(动态规划) https://www.luogu.com.cn/problem/P2511 题意: 有n根木棍, 第i根木棍的长度为 \( ...

  9. BZOJ 1041: [HAOI2008]圆上的整点

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3621  Solved: 1605[Submit][Sta ...

随机推荐

  1. TetBrains产品快捷键大全

     快捷键大全

  2. iscsi挂载

                                                                         iscsi挂载 1.server端:   (1) yum -y ...

  3. HT4936S锂电池充放电芯片,充电宝芯片

    应用电路 引脚定义 参考 http://www.hotchip.com.cn/products/

  4. TCP/IP协议 | TCP协议 | UDP协议 | 三次握手四次挥手

    TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP.SMTP.TCP.UDP.IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP ...

  5. WebApplicationContext?

    WebApplicationContext 继承了ApplicationContext  并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题, ...

  6. poll() 方法和 remove() 方法的区别?

    poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败 的时候会返回空,但是 remove() 失败的时候会抛出异常.

  7. 介绍一下 WebApplicationContext?

    WebApplicationContext 是 ApplicationContext 的扩展.它具有 Web 应用 程序所需的一些额外功能.它与普通的 ApplicationContext 在解析主题 ...

  8. Idea学习之"使用SVN如何查看哪一行是哪一个人写的历史日志"

    点击出的方法 结果图 点击记录,显示详细

  9. 淘宝 rem 机制入门学习

    一 移动设备尺寸多种多样,带来适配难度,有时甚至无从下手.1 移动设备上的Px 像素不等于设备的物理像素.iphone 6 作为开发标准设备不等于设备的物理像素.iPhone 5 物理宽度320iPh ...

  10. java中请给出一个抽象类,可以继承实体类的例子

    例1.7.2(抽象类可以继承实体类)- class VehMark_to_win {    void steer() {        System.out.println("Turn st ...