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 <bits/stdc++.h> 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; }