游客 Signup | Login
中文 | En

2670 - 直角三角形周长

中国石油大学(北京)2014级计算机系的美女帅哥们都很喜欢数学,某生刚好就遇到一个有(ke)趣(wu)的问题。一个直角三角形的周长是120的话,那么它的三边可以是204852,或者244551,还有304050,有3种不同的解。现在你想知道如果给定一个直角三角形的周长,那么这个周长最多能有多少解呢?假设边长为整数。

Input

 

<span style="font-family:宋体;font-size:13.5pt;">第一行一个</span><span style="font-family:'Microsoft Yahei','serif';font-size:13.5pt;">T</span><span style="font-family:宋体;font-size:13.5pt;">表示</span><span style="font-family:'Microsoft Yahei','serif';font-size:13.5pt;">T</span><span style="font-family:宋体;font-size:13.5pt;">组测试数据。</span><span style="font-family:'Microsoft Yahei','serif';font-size:13.5pt;">1&lt;=T&lt;=10000</span><span style="font-family:'Microsoft Yahei','serif';"> </span> 

每组测试数据占一行仅含一个整数A0<=A<=100000

<span style="font-family:宋体;font-size:13.5pt;"></span>&nbsp;

Output

根据每组测试数据请求出以整数A为周长的直角三角形的个数。(边长都为整数的直角三角形且周长为整数A

Examples

Input

3
12
120
55440

Output

1
3
40

Solution C

#include <stdio.h>
#define M 100000
int arr[M+1];


int gcd(int a, int b)
{
    if(b==0)
        return a;
    else
        return gcd(b, a%b);
}


void init()
{
    int i, j, x, y, z;
    for(i=1; i<=800; ++i)
        for(j=i+1; 2*j*j+2*j*i<=M; ++j)
        {
                x=2*i*j;
                y=j*j-i*i;
                z=j*j+i*i;
                //确保x,y,z互质
                if(gcd(gcd(x, y), z) == 1)
                {
                    int t = x+y+z;
                    int tmp = 1;
                    while(tmp*t <= M)
                    {
                        arr[tmp*t]++;
                        ++tmp;
                    }
                }
        }
}


int main()
{
    init();
    int T, i, A;


    scanf("%d", &T);
    for(i = 1; i <= T; i++)
    {
        scanf("%d", &A);
        printf("%d\n", arr[A]);
    }


    return 0;
}

Solution C++

#include<iostream>
using namespace std;

int main()
{
	int i;       //存储测试数据的组数 
	int j;       //循环变量 
	int t1,t2;
	int a;       //边长1 
	int b;       //边长2
	int c;
	int n;
	int n1;
	long long int area = 0;
	cin >> i; 
	int *counter = new int[i]; //记录对应周长符合条件的直角三角形的组数   
	for(j = 0; j < i; j++)
	{
		cin >> n;
		counter[j] = 0;
		n1 = n*0.5;
		for(a = n/4+1; a < n1; a++)
	    {
	    	area = a*a;
	    	t1 = (n-a)/2;
	    	t2 = n/2 - a +1;
	    	if(t2 > a) continue;
		    for(b = t2; b < a && b < t1; b++)
		    {
		    	c = n - a - b;
				if(c*c == area+b*b)
		        {
		    		counter[j]++;
		    	}
		    }
	    }
	}
	for(j = 0; j < i; j++)
	{
		cout << counter[j] << endl; 
	}
	delete [] counter;
	return 0;
} 
Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题