特殊的不定方程——毕达哥拉斯三元组(勾股数组)
毕达哥拉斯三元组:若正整数x,y,z满足下x^2+y^2=z^2.满足这个方程的正整数三元组被称为毕达哥拉斯三元组。
本原毕达哥拉斯三元组:若gcd(x,y,a)=1,则正整数三元组被称为本原毕达哥拉斯三元组。
定理:正整数x,y,z构成一个本原毕达哥拉斯三元组且y为偶数,当且仅当存在互素的正整数m,n(m>n),其中m为奇数,n为偶数,或者m为偶数,n为奇数。并且满足
x=m^2-n^2
y=2*m*n
z=m^2+n^2;
例题一:Fermat vs. Pythagoras(pku 1305)
给定一个整数n,分别求n范围内的(x,y,z<=n)本原毕达哥拉斯三元组的个数,以及n以内且毕达哥拉斯三元组不涉及的数的个数。
输入:输入数据有多组,每组数据占一行,包含一个整数n。
输出:对于每组输入,输出两个数分别代表n范围内(x,y,z<=n)本原毕达哥拉斯三元组的个数以及n以内且毕达哥拉斯三元组不涉及的个数。
-
10 25 100
-
1 4 4 9 16 27
分析:根据定理,本原毕达哥拉斯三元组满足
x=m^2-n^2
y=2mn
z=m^2+n^2
其中:m>n,且m为奇数,n为偶数,或者m为偶数,n为奇数。
那么所给范围内本原毕达哥拉斯三元组数,只需对m,n进行枚举即可。然后将三元组乘以i (保证i*z在所给的范围之内),就可以求出所有的毕达哥拉斯三元组。
#include<cstdio>#include<iostream>#include<cstring>#include<cmath>#define N 1000010using namespace std;bool flag[N];///如果涉及毕达哥拉斯三元组,为1,否则为0;int gcd(int a,int b){if(b==0)return a;return gcd(b,a%b);}void solve(int t){int i;int x,y,z;int temp,m,n;int ans1=0,ans2=0;///ans1记录本原毕达哥拉斯三元组的组数,ans2记录不涉及数的个数memset(flag,0,sizeof(flag));///初始化temp=sqrt(t+0.0);///m,n的最大取值为根号tfor(n=1;n<=temp;n++){for(m=n+1;m<=temp;m++){if(m*m+n*n>t)break;if(n%2!=m%2){if(gcd(m,n)==1)///判断是否互素{x=m*m-n*n;y=2*m*n;z=m*m+n*n;ans1++;for(i=1;;i++){if(i*z>t)break;flag[i*x]=1;flag[i*y]=1;flag[i*z]=1;}}}}}for(i=1;i<=t;i++)if(flag[i]==0)ans2++;cout<<ans1<<" "<<ans2<<endl;}int main(){int n;while(scanf("%d",&n)!=EOF){solve(n);}return 0;}
例题二:Right-angled Triangle(fzu 1669)
求满足以a,b为直角边,c为斜边,且满足a+b+c<=L的直角三角形的个数。
输入:输入数据有多组,每组占一行,包含一个整数L(L<=2 000 000).
输出:每组输出一个正数即满足已知条件的直角三角形的个数
-
12 40
-
1 5
分析:根据定理,本原毕达哥拉斯三元组满足
x=m^2-n^2
y=2mn
z=m^2+n^2
其中:m>n,且m为奇数,n为偶数,或者m为偶数,n为奇数。
那么所给范围内本原毕达哥拉斯三元组数,只需对m,n进行枚举即可。然后将三元组乘以i(保证 i*(x+y+z)在所给的范围之内)倍,就可以求出所有满足条件的毕达哥拉斯三元组。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define N 1000005
using namespace std;
bool flag[N];
int gcd(int a,int b)
{if(b==0)return a;return gcd(b,a%b);
}
void solve(int t)
{int temp;int m,n;int x,y,z;int i,ans=0;///记录本原毕达哥拉斯三元组的个数,初始化为0memset(flag,0,sizeof(flag));///数组没啥卵用temp=sqrt(t+0.0);for(n=1;n<=temp;n++){for(m=n+1;m<=temp;m++){if(2*m*m+2*m*n>t)///x+y+z=2m^2+2mnbreak;if(n%2!=m%2){if(gcd(m,n)==1){x=m*m-n*n;y=2*m*n;z=m*m+n*n;for(i=1;;i++){if(i*(x+y+z)>t)break;ans++;}}}}}cout<<ans<<endl;
}
int main()
{int n;while(scanf("%d",&n)!=EOF){solve(n);}return 0;
}
特殊的不定方程——毕达哥拉斯三元组(勾股数组)相关推荐
- matlab毕达哥拉斯质数,“毕达哥拉斯-史仲夏”常用勾股数组表
毕达哥拉斯方程:(2uv)^2+(u^2-v^2)^2=(u^2+v^2)^2 求证勾股数组的规律: 1.uv=质数:只有一组勾股数组. 2.u^2+v^2=u^2-v^2+2v^2. 只要掌握了这两 ...
- 三元二次方程式x2+y 2=z2的正整数解x、y、z称为一组勾股数,又称为毕达哥拉斯三元数组。该方程式也称为“商高方程”或“毕达哥拉斯方程”。 试通过程序设计求指定区间[a,b]内的所有勾股数组。
/*试通过程序设计求指定区间[a,b]内的所有勾股数组. 输入 输入两个正整数a, b (a<b). 输出 输出[a,b]区间内的所有勾股数组. 样例输入 30, 90 样例输出*/ #defi ...
- 数论概论笔记(二)勾股数组
毕达哥拉斯定理(即勾股定理) a2+b2=c2a^2+b^2=c^2a2+b2=c2 显然勾股数组有无穷个,对存在的勾股数组每个数乘上一个正整数d即可得到新的勾股数组. 因此我们关注两两互质的三元组, ...
- 【数论】本原勾股数组(PPT)的性质
目录 基本性质 勾股数组定理 代码与例题 其他性质 与单位圆的联系 基本性质 勾股数组我们都很熟悉,给一个勾股数组同乘一个整数得到的仍是勾股数组,但我们对它并不感兴趣,今天我们只研究它的本原形式(当然 ...
- python求基本勾股数_第一章:勾股数组(1)
毕达哥拉斯定理(即勾股定理),它表明任一个直角三角形的两条直角边长的平方和等于斜边长的平方.用公式表示就是 a^2 + b^2 = c^2 第一个问题是,是否存在无穷多个勾股数组,即满足方程a^2 + ...
- 《数论概论》读书笔记(第二章)勾股数组
本章主要讨论的是本原勾股数组,也就是关于满足a2+b2=c2a^2+b^2=c^2的三元组(a,b,c)(a,b,c),且(a,b,c)(a,b,c)互质的问题. 这章中提到一个概念:本原勾股数组(P ...
- 数论概论 第二章 勾股数组
本章主要讨论的是勾股数组,也就是关于满足a^2+b^2=c^2的三元组(a,b,c)的问题. 其实,对于勾股数组的个数进行讨论并没有多大意义,因为已知a,b,c为勾股数组,那么显然有da,db,dc( ...
- 本原勾股数组(数论日常1)
本原勾股数组 本原勾股数组(简称PPT)是一个三元组(a,b,c),其中a,b,c没有公因数,且满足 a2+b2=c2a^2+b^2=c^2a2+b2=c2 下面的定理可以求它的所有解. 勾股数组定理 ...
- 勾股数组【学习笔记】
本原勾股数组(简写为PPT)是一个三元组(a,b,c),其中a,b,c没有公因数,且满足a^2 + b^2 = c^2.例如下面是一项本原勾股数组: (3,4, 5),(5,12,13),(8,15, ...
最新文章
- Two Straws May Make a Perfect Diamond: Selecting Individually Weak Features for a Better Accuracy
- 解决Jupyter notebook安装后不自动跳转网页的方法
- 在苹果Mac上的“磁盘工具”中如何修复储存设备?
- HBase 写优化之 BulkLoad 实现数据快速入库
- Java学生成绩管理系统(一次学会java类及容器使用,内含java编程小tips)
- 高通芯片校准中的RGI、ICQ是什么意思,校准的特征化是什么意思?(转)
- java poi 替换word,POI替换Word中的mark标记(指定字符串)
- 在电脑上怎么做报表新手_自己怎样在电脑上制作表格
- 2019.12.31大一练习赛
- 依据数据简单分析,发掘潜在客户
- next主题搭建相册(无需安装插件,代码即可实现)
- java安装的时候无效参数,java.sql.SQLException: 调用中无效的参数
- vscode编译Window c++程序缺少vc运行库解决方法
- 豆瓣 9.3 的高分,牛逼的 Git!
- HTTP 状态码 301 和 302 详解及区别——辛酸的探索之路
- windows server 2012 RD服务器
- 关于产品的一些思考——腾讯之手机安全管家
- 第19步:重用对话框
- 一次nginx代理前端报rewrite or internal redirection cycle while internally redirecting to “index.html“ 记录
- matlab中用imnoise向图像中加入特定高斯半径的噪声