题目描述:对于给定周长n,有且只有一种方案使得所围成的直角三角形各边长为整数,求有多少个这样的n(1<=n<=1.5∗106)
和圆上的整点那道题差不多……
可以先求出各边长互质的三角形
a2+b2=c2
a2=(c+b)(c−b)
则有c+b,c−b为完全平方数或完全平方数的两倍
然后枚举……
【答案】161667
#include <iostream>
#include <cstdio>
#define N 1500000
using namespace std;
int f[5 * N + 5];
int gcd(int a,int b)
{
return b ? gcd(b,a % b) : a;
}
int main()
{
for (int i = 1;i * i <= N;i ++)
for (int j = i + 1;j * j <= N;j ++)
{
int c = i * i + j * j,b = j * j - i * i,a = 2 * i * j;
if (a > b) continue;
if (gcd(a,b) == 1) f[a + b + c] ++;
if (c&1 || b&1) continue;
c >>= 1,b >>= 1,a >>= 1;
if (gcd(a,b) == 1) f[a + b + c] ++;
}
for (int i = N-1;i >= 1;i --)
for (int j = 2;i * j <= N;j ++) f[i * j] += f[i];
int tot = 0;
for (int i = 1;i <= N;i ++)
if (f[i] == 1) tot ++;
cout << tot << endl;
}