素数与π

关于素数的初步讲解,请戳这儿

本文包含读《隐藏在素数规律中的π》 的学习笔记。


今有结论如下。
若一整数

N=p1x1p2x2...paxaN=p_1^{x_1}p_2^{x_2}...p_a^{x_a}

则以原点为圆心、N\sqrt N 为半径的圆上有格点个数4×(i=1a(j=0xiχ(pij)))4\times(\prod_{i=1}^{a}{(\sum_{j=0}^{x_i}{\chi(p_i^j)})})其中 pp 是素数,且 nZ\forall n\in\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}

题目描述 luogu P2508\text{luogu P2508}

求一个给定的圆 x2+y2=r2x^2+y^2=r^2,在圆周上有多少个点的坐标是整数。

Solution 2508\text{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 蛋疼写的一道数学趣题

posted @ 2019-04-23 15:36  TeacherDai  阅读(388)  评论(0)    收藏  举报