【数学】NOIP数论内容整理

NOIP数论内容整理

注:特别感谢sdsy的zxy神仙以及lcez的tsr筮安帮助审稿

一、整除:

对于a,b  Z,若 k  Z,s.t. b = k × a,则说a整除b,记做a | b

二、带余除法:

  a,b  z存在且仅存在唯一的q,r  Zs.t. b = q × a+r,其中r  [0,a)。记做r = b Mod a

三、公约数

a,b  Z,若  k,x,y  Zs.t. a =k × x,b = k × y,则说ka,b的公约数。公倍数同理。

四、gcdlcm

a,b的最大公约数为gcd(a,b),最小公倍数为lcm(a,b)

五、最大公约数与最小公倍数乘积性质定理

性质:a × b=gcd(a,b) × lcm(a,b)

六:最大公约数的求取:(以下不妨设b  a)

更相减损术:gcd(a,b) = gcd(b,ab)

欧几里得算法:gcd(a,b) = gcd(b,a Mod b)

其中,更相减损术的复杂度是O(n),欧几里得算法的复杂度是O(logn)。其中n = max(a,b)

七:更相减损术的优化

引理: m  0, a,b  Z,有m × gcd(a,b)=gcd(ma,mb)

a,b是两个偶数时,显然gcd(a,b)有一因数2。于是gcd(a,b) = 2 × gcd(a2,b2)

a,b一奇一偶的时候,不妨设a是偶数。显然gcd(a,b)不含因子2。于是有gcd(a,b)=gcd(a2,b)

a,b同为奇数时,直接应用更相减损术。gcd(a,b)=gcd(b,ab)

考虑两个奇数相减答案显然是偶数。于是一次更相减损术显然对应一个数除以2的操作。即更相减损的次数与除以二的操作次数同阶。考虑一个数最多被除log次。于是该算法的复杂度为O(logn)

该算法常用在对两个高精度数求gcd,因为两个高精度数做除法的复杂度难以承受,从而应用该算法。

八、例题:

给定一个序列,要求支持区间加法。多次查询区间内所有数字的gcdn,m,ai  105

Solution:

因为区间加法无法维护gcd,所以显然不能暴力线段树。考虑对原序列做差分。由更相减损定理,显然成立gcd(a,b,c) = gcd(a,ba,cb)。于是差分后区间加法改为单点修改操作。于是一次操作的复杂度为O(log2n)。总时间复杂度为O(mlog2n),可以通过本题。

九、扩展欧几里得算法

裴蜀定理:关于x,y的方程ax+by=c有解当且仅当gcd(a,b)|c

求关于x,y的方程ax+by=c的一组整数解。

不妨设c=gcd(a,b)。否则左侧乘一常数k,不失一般性

根据欧几里得算法,有

gcd(a,b)=gcd(b,a Mod b)

于是有

ax+by=gcd(a,b)=gcd(b,a Mod b)=bx0+(a Mod b)y0

于是有

(1)ax+by=bx0+(aab × b)y0(2)=ay0+b(x0ab y0)

根据对应系数相等,显然有x=y0,y=x0ab y0。考虑他的一组特解:当b=0时,显然x=1,y=0成立。

求上述方程的所有解

假设求出的该方程的一组特解x=x0,y=y0,则该方程的所有解为x=x0+k × bgcd(a,b),y=y0k × agcd(a,b)

十、素数:

有且仅有1和本身两个因子的数是素数

十一、埃拉托色尼筛法:

对每个数只筛掉它的倍数。

int pcnt;
int prime[maxn];
bool is_not_prime[maxn];

void Get_Prime(int x) {
	is_not_prime[1]=true;
	for(int i=1;i<=x;++i) if(!is_not_prime[i]) {
		prime[++pcnt]=i;
		for(int j=i*i;j<=x;j+=i;) is_not_prime[j]=true;
	}
}

十二:欧拉筛法

对每个数只被他的最小素因子筛掉

int pcnt;
int prime[maxn];
bool is_not_prime[maxn];

void Get_Prime(int x) {
	is_not_prime[1]=true;
	for(int i=2;i<=x;++i) {
		if(!is_not_prime[i]) prime[++pcnt];
		for(int j=1;j<=pcnt;++j) {
			if(i*prime[j] > x) break;
			is_not_prime[i*prime[j]]=true;
			if(!(i%prime[j])) break;
		}
	}
}

十三:在O(nlogn)时间内筛除n以内所有数的素因子

对于每个数记录自己的最小素因子。对于第每个数,迭代将每个数除以自己的最小素因子。

int pcnt;
int prime[maxn],pre[maxn];
bool is_not_prime[maxn];

void Get_Prime(int x) {
	is_not_prime[1]=true;
	for(int i=2;i<=x;++i) {
		if(!is_not_prime[i]) prime[++pcnt],pre[i]=pcnt;
		for(rg int j=1;j<=pcnt;++j) {
			if(i*prime[j] > x) break;
			is_not_prime[i*prime[j]]=true;
			pre[i*prime[j]]=j;
			if(!(i%prime[j])) break;
		}
	}
}

void ans(int x) {
	for(int i=1;i<=x;++i) {
		printf("%d:",i);
		int di=i;
		while(di != 1) printf("%d",prime[pre[di]]),di/=prime[pre[di]];
		putchar('\n');
	}
}

十四、唯一分解定理:

 x  Z,存在且仅存在一个形如x=p1c1 p2c2 ... pkck的等式。其中满足pi < pi+1,pi为质数,ci  Z

则对于a,bgcd,lcm,其唯一分解式对应位置的指数取min,max即为对应的gcd,lcm的唯一分解式

十五、欧拉phi函数:

定义:ϕ(n)[1,n)中与n互质的数的个数

ϕ(n) = n (11p1)(11p2)...(11pk)

其中pin的唯一分解式对应底数。

证明:不妨设n只有p,q两个因数。否则做数学归纳

则与n互质的数的个数为n减去p的倍数和q的倍数。根据容斥原理,应加回(pq)的倍数。即

(3)ϕ(n)= nnpnq+npq(4)= n(11p1q1pq)(5)= n(11p)(11q)

对于n有更多因数的情况,可以依据唯一分解定理做数学归纳。证毕。

求单个数字的ϕ函数:

暴力枚举质因数。复杂度O(n)

埃拉托色尼筛法:

对每个质数,修改他的倍数的phi函数值

int pcnt;
int prime[maxn],phi[maxn];
bool is_not_prime[maxn];

void euler(int x) {
	for(int i=1;i<=x;++i) phi[i]=i;
	for(int i=2;i<=x;++i) if(!is_not_prime[i]) {
		prime[++pcnt]=i;phi[i]=i-1;
		for(rg int j=i*i;j<=x;j+=i) {
			is_not_prime[j]=true;
			phi[j]=phi[j]/i*(i-1);
		}
	}
}

欧拉筛:

对每个数,只被他的最小质因子筛掉。

考虑通过一个质因子求出他的欧拉函数值。

引理:x为质数,显然ϕ(x)=x1
定理一: x  Z,p|x,若xpp互质,则ϕ(x)=ϕ(xp) × p
证明:

不妨设 x 有且仅有 p,q 两个质因子,否则对q做数学归纳,不失一般性

q = xp

于是由容斥原理有

ϕ(x) = x  xp  xq + xpq

ϕ(xp) = xp xp2  xpq+ xp2q

上式除以下式,得

ϕ(x)ϕxp=p

移项整理后,原式得证。

证毕。

定理二: x  Z,p|x,若xpp互质,则ϕ(x)=ϕ(xp) × (p1)
证明:

易证phi函数为积性函数。因为xpp互质,于是ϕ(x)=ϕ(xp) × ϕ(p)

又因为p是一个质数,于是根据引理,ϕ(p)=p1

原式得证。

证毕。

于是对于每个数,若他是质数,则应用引理,否则在筛时,若最小质因子与他互质,则应用定理二,否则应用定理一。

int pcnt;
int prime[maxn],phi[maxn];
bool is_not_prime[maxn];

void euler(int x) {
	phi[1]=1;
	is_not_prime[1]=true;
	for(int i=1;i<=x;++i) {
		if(!is_not_prime[i]) prime[++pcnt]=i,phi[i]=i-1;
		for(int j=1;j<=pcnt;++j) {
			if(i*prime[j] > x) break;
			is_not_prime[i * prime[j]]=true;
			if(!(i%prime[j])) {phi[i*prime[j]]=phi[i]*prime[j];break;}
			else phi[i*prime[j]]=phi[i]*(prime[j]-1);
		}
	}
}

十六、模方程:

定义:a,b  Z,若a Mod m = b Mod m 则称作a,b在模m域下同余。记做a  b (Mod m)

同余式两边支持同时加、减、乘同一个数字,但不支持除法。

十七、模逆元:

 a  Z,若 x  Z,s.t. ax  1 (Mod m)则称xa在模m域下的逆元。在模m域下,任何一个整数除以a完全等价于乘x

一般而言,m为质数是a存在逆元的充分条件

十八、逆元的求法

单个数求逆元

解方程ax  1 (Mod m),发现等价于ax+km=1。直接使用exgcd求得答案即可。

线性筛逆元:

x的逆元为x1,数组表示为invx

则有线性递推式:invi = (mi × invm Mod i+m) Mod m

证明:

对于所有的i,写出他的带余除法表达式:

m = ki + r,r  [0,i)

Mod m域下有:

ki + r  0 (Mod m)

等式两侧同乘i1 × r1

化简,整理得到:

i1  kr1(Modm)

因为k = mi,原式得证。

int inv[maxn];

void Get_inv(int x,int p) {
	inv[1]=1;
	for(int i=2;i<=x;++i) inv[i]=(p-p/i)*inv[p%i]%p;
}
posted @   一扶苏一  阅读(2426)  评论(6编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示