首先
毕达哥拉斯定理:勾股定理又称商高定理、毕达哥拉斯定理,是平面几何中一个基本而重要的定理。勾股定理说明,平面上的直角三角形的两条直角边的长度(古称勾长、股长)的平方和等于斜边长(古称弦长)的平方。反之,若平面上三角形中两边长的平方和等于第三边边长的平方,则它是直角三角形(直角所对的边是第三边)。
毕达哥拉斯三元组:有正整数三元组x,y,z,满足x^2+y^2=z^2,这样的三元组被称为毕达哥拉斯三元组。特殊的,若gcd(x,y,z)=1,那么称这个毕达哥拉斯三元组是本原的。
定理:正整数x,y,z构成一个本原毕达哥拉斯三元组且y为偶数,当且仅当存在互素的正整数m,n(m>n),其中m为奇数n为偶数,或者m为偶数n为奇数,并且满足:
x=m^2-n^2
y=2mn
z=m^2+n^2
模板代码:
求解n以内有多少个本源的毕达哥斯拉三元组
int Bida(int n)
{
int m = floor(sqrt(n)+1e-6), r = 0;
for(int i = 2;i < m;i++)
{
for(int j = 1;j < i;j++)
{
if((i-j) % 2==0 || gcd(i,j) != 1)//i,j要互质
continue;
int x = i*i-j*j, y = 2*i*j, z = i*i+j*j;
if(z > n)
continue;
r++;
}
}
return r;
}
例题:POJ1305
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int vis[1000005];
typedef long long ll;
//求解n以内本原的毕达哥拉斯三元组有多少个
int gcd(int a,int b)
{
if(b==0)
return a;
else
{
return gcd(b,a%b);
}
}
int main()
{
int n,a,b;
int ans=0,cnt=0,x,y,z,d;
while(scanf("%d",&n)!=EOF)
{
ans=0;cnt=0;
memset(vis,0,sizeof(vis));
int m=sqrt((double)n);
for(int i=1; i<=m; i+=2)
{
for(int j=2; j<=m; j+=2) //保证奇偶性不同
{
a=max(i,j);
b=min(i,j);
d=gcd(i,j);
if(d==1)
{
x=a*a-b*b;
y=2*a*b;
z=a*a+b*b;
for(int k=1; k*z<=n; k++)
{
vis[k*x]=1;
vis[k*y]=1;
vis[k*z]=1;
}
if(z<=n)
ans++;
}
}
}
for(int i=1; i<=n; i++)
{
if(!vis[i])
cnt++;
}
printf("%d %d\n",ans,cnt);
}
return 0;
}