[FDU1669] 直角三角形

来源:互联网 发布:查看oracle数据库编码 编辑:程序博客网 时间:2024/04/30 13:56

题目描述

求满足以a,b为直角边,c为斜边,且满足a+b+c<=L的直角三角形的个数。


输入格式

输入数据有多组,每组占一行,包含一个整数L(L<=2000000)。


输出格式

每组输入输出一个整数即满足题目已知条件的三角形的个数。


样例数据

样例输入

12
40

样例输出

1
5


题目分析

比poj1305更水的存在
做法大体相似,就不赘述了


源代码

#include<algorithm>#include<iostream>#include<iomanip>#include<cstring>#include<cstdlib>#include<vector>#include<cstdio>#include<cmath>#include<queue>using namespace std;typedef long long LL;inline const int Get_Int() {    int num=0,bj=1;    char x=getchar();    while(x<'0'||x>'9') {        if(x=='-')bj=-1;        x=getchar();    }    while(x>='0'&&x<='9') {        num=num*10+x-'0';        x=getchar();    }    return num*bj;}LL Limit,ans=0;LL Gcd(LL x,LL y) {    if(y==0)return x;    else return Gcd(y,x%y);}int main() {    while(scanf("%lld",&Limit)!=EOF) {        ans=0;        for(int n=1; n<=sqrt(Limit); n++)            for(int m=n+1; m<=sqrt(Limit); m++) {                if(m*m+n*n>Limit)break;                if((m%2!=n%2)&&(Gcd(m,n)==1)) {                    LL x=m*m-n*n,y=2*m*n,z=m*m+n*n;                    LL Now=1;                    while(Now*x+Now*y+Now*z<=Limit) {                        ans++;                        Now++;                    }                }            }        printf("%lld\n",ans);    }    return 0;}

0 0