题意:求a,b,c,满足a^2+b^2=c^2并且a+b+c<=L的三元组(a,b,c)的个数,并且a<b<c。
思路:本原毕达哥拉斯三元组满足:
x=m^2-n^2
y=2mn
z=m^2+n^2
其中x^2+y^2=z^2,m和n互素(m>n),并且n和m奇偶性不同,gcd(x,y,z)=1。知道了这些,只要枚举n和m,每次得到一个本原毕达哥拉斯三元组,将其乘i就可以得到另一个三元组,计算(x+y+z)*i<=L的个数即可。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
int gcd(int a,int b) {return b==0?a:gcd(b,a%b);}
int solve(int n)
{
int cnt=0;
int m=sqrt((double)n);
for(int i=1;i<=m;++i)
{
for(int j=i+1;j<=m;j+=2)
{
if(i*i+j*j>n) break;
if(gcd(i,j)!=1) continue;
int x=j*j-i*i,y=2*i*j,z=i*i+j*j;
cnt+=n/(x+y+z);
}
}
return cnt;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
while(cin>>n)
{
int ans=solve(n);
cout<<ans<<endl;
}
return 0;
}