圆,是轴对称图形,我们只要算出第一象限中的整点,再乘以4加上坐标轴上的4个点就好了。
如何计算呢?根据勾股定理,只要找出a^2+b^2=r^2中的(a,b)对数就好了。这样,用gcd化简一下,又是数学题233.
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL n;
LL Ans;
LL GCD(LL a,LL b)
{
return b?GCD(b,a%b):a;
}
bool check(LL a,double b)
{
if(b==floor(b))
{
LL b1=floor(b);
if(GCD(a,b1)==1&&a!=b1)return true;
}
return false;
}
int main()
{
scanf("%lld",&n);
for(LL d=1;d<=(LL)sqrt(2*n);d++)
{
if((2*n)%d)continue;
for(LL a=1;a*a<=n/d;a++)
{
double b=sqrt((2*n)/d-a*a);
if(check(a,b))Ans++;
}
if(d*d!=2*n)
{
for(LL a=1;a*a<=d/2;a++)
{
double b=sqrt(d-a*a);
if(check(a,b))Ans++;
}
}
}
cout<<Ans*4+4;
return 0;
}