Solution
求 $x^2+y^2=r^2$ 的个数。
移项,$y^2=(r-x)(r+x)$
令 $(r-x,r+x)=d$ ,即 $r-x=du,r+x=dv,(u,v)=1$
所以 $y^2=d^2\cdot uv$
而 $(u,v)=1$ ,所以 $u,v$ 分别都为完全平方数。
令 $u=s^2,v=t^2$
所以 $x=\dfrac{t^2-s^2}{2}\cdot d,t=dst,r=\dfrac{t^2+s^2}{2}\cdot d$
枚举 $2r$ 的因数 $d$,再枚举 $s$ 或者 $t$,就可以了。
复杂度应该和杜教筛差不多,大约 $O(n^\frac{3}{4})$
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include<bits/stdc++.h> #define int long long #define ull unsigned long long #define maxn #define put() putchar('\n') #define Tp template<typename Ty> #define Ts template<typename Ty,typename... Ar> using namespace std; inline void read(int &x){ int f=1;x=0;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} x*=f; } namespace Debug{ Tp void _debug(char* f,Ty t){cerr<<f<<'='<<t<<endl;} Ts void _debug(char* f,Ty x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);} Tp ostream& operator<<(ostream& os,vector<Ty>& V){os<<"[";for(auto& vv:V) os<<vv<<",";os<<"]";return os;} #define gdb(...) _debug((char*)#__VA_ARGS__,__VA_ARGS__) }using namespace Debug; int R,n,ans; inline void solve(int d) { int now=n/d,i; for (i=1;i*i<=now;i++) { int sqt=sqrt(now-i*i); if (sqt*sqt+i*i==now&&__gcd(i,sqt)==1) { if ((sqt*sqt-i*i)%2) continue; int x=(sqt*sqt-i*i)/2*d; int y=d*i*sqt; if (x>0&&y>0&&x*x+y*y==R*R) ans+=2; } } } signed main(void){ int i,j,k; read(R);n=2*R; for (i=1;i*i<n;i++) if (n%i==0) { solve(i);solve(n/i); } if (i*i==n) solve(i); printf("%lld",(ans+1)*4); return 0; }
|