2862--勾股定理

来源:互联网 发布:医院预约管理系统php 编辑:程序博客网 时间:2024/05/01 16:01

勾股定理

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

给N个数,判断这N个数中存在多少组勾股数(勾股数:存在三个数满足a*a + b*b = c*c)。

输入

第一行输入一个数T(1<=T<=50),表示有T组数据。
每组数据输入一个N(1<=N<=1000)。
接下来N个数ai(1<=ai<=10^9)。

输出

每组数据输出一行,表示有多少组勾股数。

示例输入

344 3 5 34 6 7 8 1056 7 8 9 5

示例输出

210

提示

 

来源

枚举两边,对第三遍做二分查找
 

示例程序

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
long long int p[2000] ;
int num[2000] ;
int main()
{
    int t , i , j , n , l , ans ;
    long long int k ;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        for(i = 0 ; i < n ; i++)
        {
            scanf("%lld", &p[i]);
            p[i] *= p[i] ;
        }
        sort(p,p+n);
        /*for(i = 0 ; i < n ; i++)
            printf("%lld ", p[i]);
        printf("\n");*/
        memset(num,0,sizeof(num));
        k = -1 ;
        l = 0 ;
        for(i = 0 ; i < n ; i++)
        {
            if(p[i] != k)
            {
                num[i] = 1 ;
                l = i ;
                k = p[i] ;
            }
            else
                num[l]++ ;
        }
        k = -1 ;
        for(i = 0 ; i < n ; i++)
            if(num[i] == 0)
                num[i] = k ;
            else
                k = num[i] ;
        /*for(i = 0 ; i < n ; i++)
            printf("%d ", num[i]);
        printf("\n");*/
        ans = 0 ;
        for(i = 0 ; i < n ; i++)
        {
            for(j = i+1 ; j < n ; j++)
            {
                k = p[i]+ p[j] ;
                int low = 0 , mid , high = n-1 ;
                while(low <= high)
                {
                    mid = (low + high) / 2 ;
                    if( p[mid] == k )
                        break;
                    else if( p[mid] < k )
                        low = mid + 1 ;
                    else
                        high = mid - 1 ;
                }
                if(p[mid] == k)
                    ans++ ;
            }
        }
        printf("%d\n", ans);
    }
}
0 0