bzoj 1041: [HAOI2008]圆上的整点
发布日期:2021-08-13 22:07:57 浏览次数:5 分类:技术文章

本文共 1120 字,大约阅读时间需要 3 分钟。

Description

求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。

解题报告:

化简\(a^2+b^2=r^2\)
\(a^2=(r+b)(r-b)\)
提出(r+b)和(r-b)的公因子d
\(a^2=d^2*(r+b)/d*(r-b)/d\)
此时(r+b)/d和(r-b)/d 互质,所以两者都为完全平方数
所以令p,q分别为两者的平方根
可以得出\(p^2+q^2=2r/d\)
找出这样的搭配个数即是答案,所以枚举d和p,check(q)即可
这样求出的是第一象限的答案,最后再乘四加四即可

#include 
#include
#include
#include
#include
#include
#define RG register#define il inline#define iter iterator#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))using namespace std;typedef long long ll;ll gcd(ll x,ll y){ return x%y?gcd(y,x%y):y;}void work(){ ll n,t,tmp,ans=0,x,y,lim; cin>>n;n<<=1;lim=sqrt(n); for(int i=1;i<=lim;i++){ if(n%i)continue; t=n/i;tmp=sqrt(t/2); for(int j=1;j<=tmp;j++){ x=t-j*j;y=sqrt(x); if(!x)continue; if(y*y==x && x!=j*j && gcd(x,j*j)==1) ans++; } if(i==t)continue; tmp=sqrt(i/2); for(int j=1;j<=tmp;j++){ x=i-j*j;y=sqrt(x); if(!x)continue; if(y*y==x && x!=j*j && gcd(x,j*j)==1) ans++; } } printf("%lld\n",(ans<<2)+4);}int main(){ work(); return 0;}

转载于:https://www.cnblogs.com/Yuzao/p/7513375.html

转载地址:https://blog.csdn.net/weixin_30699831/article/details/98346855 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:dedecms后台验证码显示不正常的四种处理办法
下一篇:Hadoop 系列文章(一) Hadoop 的安装,以及 Standalone Operation 的启动模式测试

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月17日 14时58分38秒