【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; }