关于素数的初步讲解,请戳这儿。
本文包含读《隐藏在素数规律中的π》 的学习笔记。
今有结论如下。
若一整数
N = p 1 x 1 p 2 x 2 . . . p a x a N=p_1^{x_1}p_2^{x_2}...p_a^{x_a} N=p1x1p2x2...paxa
则以原点为圆心、
N
\sqrt N
N 为半径的圆上有格点个数
4
×
(
∏
i
=
1
a
(
∑
j
=
0
x
i
χ
(
p
i
j
)
)
)
4\times(\prod_{i=1}^{a}{(\sum_{j=0}^{x_i}{\chi(p_i^j)})})
4×(i=1∏a(j=0∑xiχ(pij)))其中
p
p
p 是素数,且
∀
n
∈
Z
∗
\forall n\in\Z^*
∀n∈Z∗,有
χ
(
n
)
=
[
n
mod
4
=
1
]
×
1
+
[
n
mod 2
=
0
]
×
0
+
[
n
mod
4
=
3
]
×
(
−
1
)
\begin{aligned}\chi(n)&=[n\text{ mod }4=1]\times1\\ &+[n\text{ mod 2}=0]\times0\\ &+[n\text{ mod }4=3]\times(-1) \end{aligned}
χ(n)=[n mod 4=1]×1+[n mod 2=0]×0+[n mod 4=3]×(−1)
题目描述 luogu P2508 \text{luogu P2508} luogu P2508
求一个给定的圆 x 2 + y 2 = r 2 x^2+y^2=r^2 x2+y2=r2,在圆周上有多少个点的坐标是整数。
Solution 2508 \text{Solution 2508} Solution 2508
此部分视频 17:53
中有详细讲解。附一参考资料。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define reg register
typedef long long ll;
int n,r;
ll ans=1;
bool tf[500010];
int pr[100010];
int sum=0;
int len=0;
void reset(){
memset(tf,1,sizeof(tf));tf[1]=0;
for(reg int i=2;i<=n;++i){
if(!tf[i]) continue;
pr[++len]=i;
for(reg int j=i+i;j<=n;j+=i)
tf[j]=0;
}
}
int main(){
scanf("%d",&r);n=sqrt(r);
reset();
for(reg int i=1;i<=len;++i){
sum=0;
while(r%pr[i]==0){
r/=pr[i];
++sum;
}
if(pr[i]%4==1) ans*=sum+sum+1;
}
if(r>1&&r%4==1) ans*=3;
printf("%lld",ans*4);
}
最后,推荐一下 lz 蛋疼写的一道数学趣题。