* 毕达哥拉斯三元组:通俗点来说就是满足勾股定理的三个数x,y,z,即满足x^2+y^2=z^2的三个正整数三元组
*
* 定理:如果正整数x,y,z构成一个毕达哥拉斯三元组且y为偶数,当且仅当存在互素的正整数m,n(m>n),其中m为
* 偶数n为奇数,或者n为偶数m为奇数,并且满足
* x=m^2-n^2
* y=2mn
* z=m^2+n^2
POJ1305
题目链接:http://poj.org/problem?id=1305
/***************
* 题意:给定一个n,分别求n范围内的本原的毕达哥拉斯三元组的个数,以及n范围内且毕达哥拉斯三元组不涉及的
*数的个数
*
* 思路:通过定理的要求,直接枚举m,n就行,在判断一个x,y,z乘以i是否满足小于n就可以,那么对于不涉及的间
*接就可算出
****************/
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<climits>
#include<cstring>
#define maxn 1000001
using namespace std;
bool flag[maxn];
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int solve(int t)
{
int x,y,z;
int ans1=0,ans2=0;
memset(flag,0,sizeof(flag));
for(int n=1;n<=sqrt(t*1.0);n++)
{
for(int m=n+1;m<=sqrt(t*1.0);m++)
{
if(n*n+m*m>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(int i=1;;i++)
{
if(i*z>t)break;
flag[i*x]=1;
flag[i*y]=1;
flag[i*z]=1;
}
}
}
}
}
for(int i=1;i<=t;i++)
{
if(!flag[i])ans2++;
}
cout<<ans1<<" "<<ans2<<endl;
}
int main()
{
int n;
while(cin>>n)
{
solve(n);
}
return 0;
}
FZU1669
/***************
* 题意:给定一个n,分别求n范围内的本原的毕达哥拉斯三元组的个数
*
* 思路:通过定理的要求,直接枚举m,n就行,在判断一个(x+y+z)乘以i是否满足小于n就可以
****************/
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<climits>
#include<cstring>
using namespace std;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int solve(int t)
{
int x,y,z;
int ans1=0;
for(int n=1;n<=sqrt(t*1.0);n++)
{
for(int m=n+1;m<=sqrt(t*1.0);m++)
{
if(2*m*n+2*m*m>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;
for(int i=1;;i++)
{
if(i*(x+y+z)>t)break;
ans1++;
}
}
}
}
}
cout<<ans1<<endl;
}
int main()
{
int n;
while(cin>>n)
{
solve(n);
}
return 0;
}