![](http://acm.fzu.edu.cn/image/problem.gif)
Accept: 94 Submit: 183
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
- A right triangle (or right-angled triangle, formerly called a rectangled triangle) has one 90° internal angle (a right angle). The side opposite to the right angle is the hypotenuse; it is the longest side in the right triangle. The other two sides are the legs or catheti (singular: cathetus) of the triangle. Right triangles conform to the Pythagorean Theorem, wherein the sum of the squares of the two legs is equal to the square of the hypotenuse, i.e., a^2 + b^2 = c^2, where a and b are the legs and c is the hypotenuse.
- An oblique triangle has no internal angle equal to 90°.
- An obtuse triangle is an oblique triangle with one internal angle larger than 90° (an obtuse angle).
- An acute triangle is an oblique triangle with internal angles all smaller than 90° (three acute angles). An equilateral triangle is an acute triangle, but not all acute triangles are equilateral triangles.
![](http://acm.fzu.edu.cn/image/Problem/1669.gif)
Input
Output
Sample Input
Sample Output
Hint
There are five right-angled triangles where a + b + c ≤ 40. That are one right-angled triangle where a = 3, b = 4 and c = 5; one right-angled triangle where a = 6, b = 8 and c = 10; one right-angled triangle where a = 5, b = 12 and c = 13; one right-angled triangle where a = 9, b = 12 and c = 15; one right-angled triangle where a = 8, b = 15 and c = 17.
Source
FOJ月赛-2008年11月
毕达哥拉斯三元组:有正整数三元组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
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int t;
while(~scanf("%d",&t))
{
int max=(int)sqrt(t)+2;
int ans=0;
for(int n=1;n<=max;n++)
{
for(int m=n+1;m<=max;m++)
{
if((m+n)%2!=1) continue;
if(2*m*m+2*m*n>t) break;
if(gcd(m,n)==1)
{
int x=m*m-n*n;
int y=2*m*n;
int z=m*m+n*n;
for(int i=1;;i++)
{
if(i*(x+y+z)<=t) ans++;
else break;
}
}
}
}
printf("%d\n",ans);
}
}