luogu2508 [HAOI2008]圆上的整点
题目大意
给出\(r\),求圆\(x^2+y^2=r^2\)上坐标均为整数的点数。\(n<=2,000,000,000\)
总体思路
我们看到这个数据大小,还是个数学题,想到这个的时间复杂度应当为\(O(\sqrt{r})\)。要达到这个效果,我们先要把\(r^2\)转化成\(r\),然后在\(\sqrt{r}\)的范围内枚举某个数。对于我们以前的经验,这枚举的“某个数”有:质因数分解、求因数等。这个题目好像跟质数的关系不大!那就是枚举因数喽!
以上的叙述就为我们以后的数学推导提供了目标。推导时,应当思维发散,大胆尝试,多尝试几种方法,最终筛选出以下数学推导得出解决办法的过程。
数学推导
经过移项等操作我们得到:
\]
我们令\(d=\gcd(r+x,r-x)\),\(A=\frac{r-x}{d},B=\frac{r+x}{d}\)。这时我们发现:
\]
这样,我们在\(\sqrt{2r}\)内枚举\(d\)(同时得到了\(d\)一个因数和\(\frac{2r}{d}\)一个因数),再在\(2r/d/2=\frac{r}{d}\)内枚举\(A\)和\(B\),看看有多少对\(A,B\)符合要求。这样我们已经把\(r\)降次了。
但是每枚举一个\(d\),都需要在\(\frac{r}{d}\)内枚举一遍\(A\),这使时间复杂度近似地变为线性,于我们要求的根号的复杂度仍然有距离。所以我们仍然要进一步优化。
推论1
对\(a,b,c\in Z\),若\(a^2=b^{2}c\),则\(\sqrt{c}\in Z\).
证明:\(c=(\frac{a}{b})^2, b^2|a^2\)
推论2
对\(a,b,c\in Z\),若\(a^2=bc\),且\(\gcd(b,c)=1\),则\(\sqrt{b}\in Z, \sqrt{c}\in Z\)
证明:因为\(b,c\)互质,故根据唯一分解定理,\(b,c\)的质因数中不存在交集。因为\(a\)是个完全平方数,组成它的所有质因数的次数都是偶数,而这些质因数都必须存在于\(b,c\)中,因此原命题成立。
这样,因为\(y^2=d^2AB\),故根据推论1,\(AB\)为完全平方数。因为\(\gcd(A,B)=1\),所以根据结论2,\(A,B\)为完全平方数。所以,为了保证枚举到的\(A\)都是完全平方数,令\(a=\sqrt{A},b=\sqrt{B}\),看看是否能同时满足存在整数\(b\)使得\(a^2+b^2=\frac{2r}{d}\)且\(\gcd(A=a^2,B=b^2)=1\)。这样\(a\)枚举的范围便是\(\sqrt\frac{r}{d}\),进一步加快了速度。
#include <cstdio>
#include <cmath>
using namespace std;
#define ll long long
ll Gcd(ll a, ll b)
{
return b ? Gcd(b, a%b) : a;
}
void Find(ll r, ll d, ll &ans)
{
for (ll a = 1; a <= sqrt(r / d); a++)
{
ll b = sqrt(r * 2 / d - a * a);
if (a * a + b * b == r * 2 / d && a != b && Gcd(a * a, b * b) == 1) ans++;
}
}
int main()
{
ll r, ans = 0;
scanf("%lld", &r);
for (ll d = 1; d * d <= r * 2; d++)
{
if (r * 2 % d == 0)
{
Find(r, d, ans);
if (d*d != r * 2)
Find(r, r * 2 / d, ans);
}
}
printf("%lld\n", ans * 4 + 4);
return 0;
}
luogu2508 [HAOI2008]圆上的整点的更多相关文章
- BZOJ 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3621 Solved: 1605[Submit][Sta ...
- bzoj 1041: [HAOI2008]圆上的整点 数学
1041: [HAOI2008]圆上的整点 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- bzoj 1041: [HAOI2008]圆上的整点 本原勾股數組
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2027 Solved: 853[Submit][Stat ...
- 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4298 Solved: 1944[Submit][Sta ...
- BZOJ 1041: [HAOI2008]圆上的整点【数论,解方程】
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4210 Solved: 1908[Submit][Sta ...
- 【BZOJ1041】[HAOI2008]圆上的整点
[BZOJ1041][HAOI2008]圆上的整点 题面 bzoj 洛谷 题解 不妨设\(x>0,y>0\) \[ x^2+y^2=r^2\\ y^2=(x+r)(x-r) \] 设\(r ...
- bzoj千题计划127:bzoj1041: [HAOI2008]圆上的整点
http://www.lydsy.com/JudgeOnline/problem.php?id=1041 设 X>0 ,Y>0 X^2 + Y^2 = R^2 X^2 = R^2-Y^2 ...
- BZOJ1041 [HAOI2008]圆上的整点 【数学】
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4631 Solved: 2087 [Submit][S ...
- BZOJ(2) 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4966 Solved: 2258[Submit][Sta ...
随机推荐
- 在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动
在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...
- 5.13redis的相关基础
二.Redis(NoSql) Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行 100000个请求,读的速度是110000次/s,写的速 ...
- Struts2 在拦截器中向Action传参
struts.xml配置文件: <package name="system-default" extends="struts-default" abstr ...
- 删除django
1.命令行运行python 2.import django3.print(django.__path__)4.删除django目录即可
- (转)JavaScript深入之从原型到原型链
构造函数创建对象 我们先使用构造函数创建一个对象: function Person() { } var person = new Person(); person.name = 'Kevin'; co ...
- 《深入理解Android虚拟机内存管理》示例程序编译阶段生成的各种语法树完整版
1.tokens "int" "int" <SPACES> " &quo ...
- C#快速获取指定网页源码的几种方式,并通过字符串截取函数 或 正则 取指定内容(IP)
//只获取网页源码开始到标题位目的进行测试 //第一种方式经过测试,稍微快点 string url = "http://www.ip.cn"; HttpWebRequest req ...
- 【sqli-labs】 less20 POST - Cookie injections - Uagent field - Error based (POST型基于错误的cookie头部注入)
以admin admin成功登陆之后,保存并显示了cookies信息 如果不点击Delete Your Cookie!按钮,那么访问 http://localhost/sqli-labs-master ...
- Type inference
Type inference refers to the automatic detection of the data type of an expression in a programming ...
- vue移动端Ui组件 mint-ui 使用指南
1.上啦加载下拉刷新的使用 this.$refs.loadmore.onTopLoaded(); this.$refs.loadmore.onBottomLoaded(); 上啦刷新下拉加载的 动画显 ...