ACM周训练总结(十)

ACM周训练总结(十)

本周学习了数论的相关知识。

一、什么是数论

数论是专门研究整数的纯数学的分支,而整数的基本元素是素数,所以数论的本质是对素数性质的研究。
(ACM中的数论主要涉及素数、约数、同余和数论函数等相关知识)

二、基本概念

1、整数集合: Z = …-2,-1,1,2…}
自然数集合: N = {0,2…}

2、整除:若a=bk,其中a,b,k都是整数,则b整除a,记做b|a ,否则记做b ta.
约数:如b|a且b≥0,则称b是a的约数(因数),a是b的倍数。
注意:●1整除任何数,任何数都整除0。
●若a|b,a|c, 则a|(b +c),a|(b-c)。
●若a|b,则对任意整数c,a|(bc)。

3、整除性
若a和b都为整数,a整除b是指b是a的倍数,a是b的约数(因数、因子),记为a|b.

4、整除的性质
●自反性:对于任意n,有n|n.
●传递性:若有a|b, b|c,则a|c.
●可消性:若a|bc,且a和c互素, 则a|b。
●组合性:若c|a,且c|b, 则对于任意整数m、n,有c| (ma+nb)。

5、素数:a>1且只能被平凡约数整除的数。
合数:a>1且不是素数的数称为合数。
其他整数(0,1,负整数)既不是素数也不是合数
注意:素数有无穷多个,但分布比较稀疏,不大于n的素数约有n/ln(n)个。

6、素数判定:若n是一个合数,则n至少有1个素因子。因此其中最小的素因子一定不大于√n。如果n是合数,则一定可以为分解axb的形式,其中a≤b,a≠1,b≠n,因aXa≤aXb=n,则可得: a≤√n.
可得判断依据:如果2~√n中有n的约数,则n是合数,否则n是素数

7、算术基本定理:对于每个整数n,都可以唯一分解成素数的乘积

三、应用

1、埃氏筛法优化找素数
基本思想:把从1开始的、某一范围内的正整数从小到大顺序排列; 1不是素数,首先把它筛掉;剩下的数中选择最小的数是素数,然后筛掉它的倍数。依次类推,直到筛子为空时结束。

#define maxn 1000000
bool isPrime[maxn+1];/* isPrime[i]true表示i为素数*/
void eratos(int n){
	int i,j;
	isPrime[0] = isPrime[1] = false;
	for(i = 2;i <= n; ++i) 
		isPrime[i] = true;	
	for(i = 2;i * i <= n; ++i) 
		if(isPrime[i]){	
				for(j = i * i;j <= n;j += i) 
					isPrime[j] = false;
			}
}

2、筛法优化因数分解
(这里的因式分解是指将一个数分解成若干个素数乘积的形式)

#define maxn 1000000
bool isPrime[maxn+1];
int minFactor[maxn+1];	//记录每个数的最小素因数的数组

void eratos(int n){
	int i,j;
	isPrime[0] = isPrime[1] = false;
	minFactor[0] = minFactor[1] = -1;
	for(i = 2;i <= n; ++i) {
			isPrime[i] = true;
			minFactor[i] = i;//初始化,表示还未找到最小的素因数
		}
for(i = 2;i * i <= n; ++i) { 
	if(isPrime[i]){
		for(j = i * i;j <= n;j += i){
			isPrime[j] = false;
			if(minFactor[j]==j) //如果此前尚未找到j的素因数,
				//那么将其设为i
				minFactor[j] = i; 
		}
	}
}
vector<int> factor(int x) {
		vector<int> ret;
		while(x > 1){
			ret.push_back(minFactor[x]);
			x /= minFactor[x];
			}
		return ret;
	}

你可能感兴趣的:(ACM周训练总结)