0
点赞
收藏
分享

微信扫一扫

毕达哥拉斯三元组


毕达哥拉斯三元组:x^2+y^2=z^2


如果有(x,y,z)=1,那么这个这个毕达哥拉斯三元组称为原本的。


原本的毕达哥拉斯三元组满足:


x=m^2-n^2


y=2mn


z=m^2+n^2 (m,n互素,且m,n奇偶性不同)



1669 Right-angled Triangle


​​http://acm.fzu.edu.cn/problem.php?pid=1669​​


大意: 求解满足毕达哥拉斯三元组关系的三元组的个数, 且x+y+z<=L

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main()
{
int L;
while(cin>>L){
int ans=0;
int len=(int)sqrt(L);
for(int n=1;n<=len;n++){
for(int m=n+1;m<=len;m+=2){
if(gcd(n,m)==1){
int x=m*m-n*n;
int y=2*m*n;
int z=m*m+n*n;
int sum=x+y+z;
if(sum<=L) {
ans+=(L/sum);
}
}
}
}
printf("%d\n",ans);
}
return 0;
}



Fermat vs. Pythagoras


​​http://poj.org/problem?id=1305​​


大意:求解N以内的三个数互质的毕达哥拉斯三元组的个数和N以内毕达哥拉斯三元组不涉及的数字的个数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int N=1e6+10;
bool vis[N];
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main()
{
int p;
while(scanf("%d",&p)!=EOF){
memset(vis,0,sizeof(vis));
int ans1=0,ans2=0;
int len=int(sqrt(p*1.0));
for(int n=1;n<=len;n++){
for(int m=n+1;m<=len;m+=2){
if(gcd(n,m)==1){
int x=m*m-n*n;
int y=2*m*n;
int z=m*m+n*n;
if(z>p) break;
ans1++;
vis[x]=vis[y]=vis[z]=1;
for(int i=2;z*i<=p;i++){
vis[x*i]=vis[y*i]=vis[z*i]=1;
}
}
}
}
for(int i=1;i<=p;i++) if(vis[i]) ans2++;
ans2=p-ans2;
printf("%d %d\n",ans1,ans2);
}
return 0;
}



举报

相关推荐

0 条评论