51nod 1165 整边直角三角形的数量


直角三角形的三边都可以表示为 $x=t(a^2-b^2),y=2tab,z =t(a^2+b^2)$,$t,a,b$ 都是整数且 $a>b,\gcd(a,b)=1$,$a,b$ 为一奇一偶。
可以预处理出 $C_i$ 表示 $t=1$ 时有多少直角三角形的周长为 $i$,这个暴力枚举 $a$,$b$ 就行了。
然后枚举 $t$ 即可。

#include 

const int N = 1e7 + 7;
int mp[N];

void solve(int n) {
    int sqr = sqrt(n + 0.5);
    int ans = 0;
    for (int i = 1; i * i <= n; i++) {
        if (n % i == 0) {
            ans += mp[i];
            if (i * i < n) ans += mp[n / i];
        }
    }
    printf("%d\n", ans);
}

int main() {
    for (int a = 1; a <= 3000; a++) 
        for (int b = 1; b < a; b++) {
            if (std::__gcd(a, b) == 1 && ((a & 1) != (b & 1))) {
                int x = a * a - b * b, y = 2 * a * b, z = a * a + b * b;
                int C = x + y + z;
                if (C <= 10000000)
                    mp[C]++;
            }
        }
    int T;
    scanf("%d", &T);
    while (T--) {
        int n;
        scanf("%d", &n);
        solve(n);
    }
    return 0;
}
View Code

 

你可能感兴趣的:(51nod 1165 整边直角三角形的数量)