复杂的计算
/************************************************************** Problem: 1041 User: lxy8584099 Language: C++ Result: Accepted Time:268 ms Memory:832 kb ****************************************************************/ /* 存在i*i+j*j=r*r 则 j*j=(r+i)*(r-i) G=gcd((r+i),(r-i)) A=(r+i)/G,B=(r-i)/G; j*j=G*G*A*B 且 A,B 互质 则 A,B均为 完全平方数 A=a*a B=b*b A+B=a*a+b*b=2*r/G G一定为2*r的约数 枚举G 枚举a 计算b 满足条件就可以ans++ */ #include<cmath> #include<cstdio> using namespace std; typedef long long ll; ll r,ans; ll gcd(ll a,ll b) { return b==0?a:gcd(b,a%b); } bool check(ll a,double b) { ll bb=(ll)(floor(b)); if(b!=bb) return 0; // 判断b是不是整数 if(gcd(bb*bb,a*a)==1&&a!=bb) return 1; // 判断是否满足 A,B互质且不等 return 0; } int main() { scanf("%lld",&r); for(ll G=1;G<=(ll)(sqrt(r*2));G++) if((r*2)%G==0) { for(ll a=1;a<=sqrt(r/G);a++) { double b=sqrt((r*2)/G-a*a); if(check(a,b)) ans++; } if((r*2)/G!=G) { // G= (r*2)/G for(ll a=1;a<=sqrt(G/2);a++) { double b=sqrt(G-a*a); if(check(a,b)) ans++; } } } ans*=4; // 只计算了第一象限 ans+=4; // 加上坐标轴上的 4个点 printf("%lld\n",ans); return 0; }