博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1041 数学推理
阅读量:5788 次
发布时间:2019-06-18

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

原题传送门

我们只需要求第一象限内(不包括坐标轴)的点数然后ans=ans*4+4就好了

首先我们知道圆上点的方程关系

x*x+y*y=r*r

那么我们变下型

Y*Y=R*R-X*X             

Y*Y=(R-X)*(R+X)        ①

我们令d=gcd(r-x,r+x)

设A=(r-x)/d;

    B=(r+x)/d;

因为我们要求x为整数,那么需要A,B为整数

 

将A,B带回①可得

A*B*d*d=y*y

因为我们要求y为整数,那么需要A*B*d*d为完全平方数

因为点在第一象限内,所以A<>B,所以A,B应为完全平方数

那么当A,B为完全平方数时,x,y为整数

那么我们可以设A=a*a; B=b*b;

则有a*a=(r-x)/d;  b*b=(r+x)/d;

那么两式相加,得到a*a+b*b=2*r/d;

那么只要a,b为整数,就可以得到一组整点

那么我们可以知道d|2*r

所以我们可以枚举2*r的因数,对于每个因数(每个因数对应一对儿因数,分别是d和2*r/d)

假设因数是d的时候,因为a<b所以2*a*a<2*r/d, 所以a*a<r/d 那么我们可以枚举a<sqrt(r/d),

对于每个a我们可以算出b,相对应的A,B应满足gcd(A,B)=1且A<>B如果满足,就累加答案

 

1 /************************************************************** 2     Problem: 1041 3     User: BLADEVIL 4     Language: Pascal 5     Result: Accepted 6     Time:136 ms 7     Memory:224 kb 8 ****************************************************************/ 9  10 //By BLADEVIL11 var12     r                           :int64;13     ans                         :int64;14      15 function gcd(a,b:int64):int64;16 begin17     if b>a then exit(gcd(b,a)) else18     if b=0 then gcd:=a else gcd:=gcd(b,a mod b);19 end;20      21 function check(y:int64;x:extended):boolean;22 var23     x1                          :int64;24 begin25     if x=trunc(x) then26     begin27         x1:=trunc(x);28         if (gcd(x1*x1,y*y)=1) and (x1*x1<>y*y) then29         begin30             exit(true);31         end;32     end;33     exit(false);34 end;35      36 procedure main;37 var38     d, a                        :longint;39     b                           :extended;40 begin41     read(r);42     for d:=1 to trunc(sqrt(2*r)) do43     begin44         if (2*r) mod d=0 then45         begin46             for a:=1 to trunc(sqrt(r/d)) do47             begin48                 b:=sqrt(((2*r)/d)-a*a);49                 if check(a,b) then ans:=ans+1;50             end;51             if d<>((2*r) div d) then52             for a:=1 to trunc(sqrt(d/2)) do53             begin54                 b:=sqrt(d-a*a);55                 if check(a,b) then ans:=ans+1;56             end;57         end;58     end;   59     writeln(ans*4+4);60 end;61  62 begin63     main;64  65 end.

 

转载于:https://www.cnblogs.com/BLADEVIL/p/3433558.html

你可能感兴趣的文章
Spring 定时执行任务重复执行多次
查看>>
整理struct sockaddr和struct sockaddr_in
查看>>
openssl内存分配,查看内存泄露
查看>>
反射(二)
查看>>
用Python生成测试数据
查看>>
黑马程序员_面向对象的三大特征
查看>>
Website for the introduction to Matlab and Java
查看>>
0505.Net基础班第二十天(基础加强总复习)
查看>>
SQL SERVER 数据库邮件配置
查看>>
C#操作Excel数据增删改查(转)
查看>>
HTML5 Canvas(画布)
查看>>
py 的 第 19 天
查看>>
在着手开发一款移动应用之前,我们需要考虑哪些因素?
查看>>
Windows 2003 Server R2 x64 IIS6.0 eWebEditor无法显示的问题
查看>>
topcoder srm 320 div1
查看>>
一句话木马及菜刀的使用
查看>>
通用类 RemoteUpload 远程上传从其他网站复制过来的图片
查看>>
UISlider 设置增量
查看>>
软件项目测试作业1
查看>>
iOS 沙盒
查看>>