【bzoj1041】[HAOI2008]圆上的整点
n=d*(u^2+v^2),枚举d(从1到sqrt(n)),然后判断n/d和d。再枚举一组u,v,如果gcd(u,v)=1,则是一组可行解。枚举八分之一圆,答案乘以8,再加上4个坐标轴上的点。
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long LL;
LL r,n;
LL ans=1;
LL gcd (LL a,LL b)
{
return b==0 ? a : gcd(b,a%b);
}
LL work(LL d)
{
LL k=0,res=2*r/d;
for (LL i=1;i*i<=res;i++)
{
LL t=res-i*i;
LL v=(LL)sqrt(t+0.5);
if (i>=v)
break;
if (i*i+v*v==res && gcd(i,v)==1)
k++;
}
return k;
}
int main()
{
scanf("%lld",&r);
n=2*r;
for (LL i=1;i*i<=n;i++)
if (n%i==0)
{
ans+=work(i);
if (i*i==n)
break;
ans+=work(n/i);
}
printf("%lld\n",ans<<2);
return 0;
}

浙公网安备 33010602011771号