一篇不大正经的关于数论的总结(未完

###顶函数($\lceil {x} \rceil$)、底函数($\lfloor {x} \rfloor$): 常称之为高斯(取整)函数。 ####定义: 顶函数:$\geq {x}$的最小整数。 底函数:$\leq {x}$的最大整数。 举个例子:ios

$1.\lceil {1.5} \rceil=2$ $2.\lfloor {1.5} \rfloor=1$ $3.\lceil {-1.5} \rceil=-1$ $4.\lfloor {-1.5} \rfloor =-2$ ###带余除法: ####定义: $对于任意整数a,b(a\geq b,b\neq 0),$$存在q,r,知足a=qb+r(0\leq r \leq |b|),且q,r惟一$ 咱们把a叫作被除数,b叫作除数,q叫作商,r叫作余数。 能够证实$q=\lfloor \left (\frac {a}{b}\right )\rfloor,r=a-b\lfloor \left(\frac {a}{b} \right)\rfloor$(证实以下) $\because这个是很显然的$ $\therefore q=\lfloor \left (\frac {a}{b}\right )\rfloor,r=a-b\lfloor \left(\frac {a}{b} \right)\rfloor$ ###整除: ####定义:若是$a$能把$b$除尽,余数为0,那么就说是$b$被$a$整除,即$a|b$。 ####整除的性质:c++

  • 自反性:对于任意$n$,有$n|n$。
  • 传递性:若$a|b,b|c$,那么$a|c$。
  • 反对称性:若$a|b,b|a$,即$a=b$。(对称性:若$a$知足$b\cdots$关系,那么$b$也知足$a\cdots$关系)
  • 若$b|a,c|b$,则$c|a$。(证实以下)

$\because b|a,c|b$ $\therefore(因此必然存在两个整数x,y)使得a=xb$,$b=yc$ $又\therefore a=xyc$ $\because a/c=xy$ $\therefore c|a$算法

  • 若$c|a,c|b$,则对任意数$x,y$,必有$c |(ax+by)。$(证实以下)

$\because c|a,c|b$ $\therefore (因此必然存在两个整数p,q)使得a=pc$,$b=qc$ $又\therefore c |(pcx+qcy)$ $c|c(px+qy)$ $\because 两边都有c$ $\therefore c(px+qy)是c的倍数$ $又\therefore c|(ax+by)$函数

  • 若$b|a,a\neq 0$,则有$|b| \leq |a|$。(证实以下)

$\because b|a$ $\therefore (因此必然存在一个整数q)使得a=qb$ $又\therefore a是b的倍数,|b| \leq |a|$。ui

  • 若$b|a,a\neq 0$,则$\left( \frac ab \right)|a$。(证实以下)

$\because b|a$ $\therefore (因此必然存在一个整数q)使得a=qb$ $又\therefore \left( \frac {a}{b} \right)=\left( \frac {qb}{b} \right)=q$ $\because a是q的倍数$ $\therefore q|a$ $又\therefore \left(\frac{a}{b}\right)|a$spa

  • 若$b|a,c|a,b\bot c$,则$bc|a$。(举例以下)

$1.当a=12,b=1,c=6时,1|12,6|12,1\bot12,6|12。$ $2.当a=72,b=8,c=9时,8|72,9|72,8\bot9,72|72。(自反性:72|72)$3d

  • 若$a|b,b|a$,则$|a|=|b|$。(反对称性)
  • 若$a|b$,对任意整数$c$,则$a|bc$。(证实以下)

$\because a|b$ $\therefore b=xa,b是a的倍数$ $又\therefore乘上任意整数c,bc依旧是a的倍数$ $又\therefore a|bc$code

  • 若$a|b$,对于任意整数$m(m\neq0)$,则$ma|mb$。(证实以下)

$\because 这是显然的$ $\therefore ma|mb$ ###惟一分解定理(算术基本定理): $n=p_1^{r_1}p_2^{r_2}\cdots$ 其中$p_i$是质数,$p_1=2,p_2=3 \cdots$以此类推 ####结论: 设$p$为质数,对于任意整数$a$,则有$p|a$或者$(p,a)=1$。(证实以下) $\because p为质数$ $\therefore a要么是p的倍数,要么p\perp a。 $ $又\therefore p|a或者(p,a)=1$ ###约数和倍数: ####推论: 在算术基本定理中,若$N$被惟一分解为$N=p_1^{c_1}p_2^{c_2}\cdots p_m^{c_m}$,其中$c_i$是正整数,$p_i$是质数且知足$p_1<p_2<\cdots p_m$,则$N$的正整数集合可写做$:$blog

<center>{$p_1^{b_1}p_2^{b_2}\cdots p_m^{b_m}$},其中$0\leq b_i \leq c_i$ </center> N的正约数个数为$:$ $$(c_1+1)*(c_2+1)*\cdots*(c_m+1)=\prod_{i=1}^{m}(c_i+1)$$ $N$的全部正约数之和为$:$ $$(1+p_1+p_1^2+\cdots+p_1^{c_1})*\cdots*(1+p_m+p_m^2+\cdots+p_m^{c_m})=\prod_{i=1}^{m}(\sum_{j=0}^{c_i}(p_i)^{j})$$ ####定义: 若$a|b,a$是$b$的约数,$b$是$a$的倍数,称$a$为$b$的因子(对于任何数$n$,至少有两个因子$1$和$n$自己,称它们为$n$的平凡因子,其余即为非平凡因子)。特别的,任何正整数都是$0$的约数。 ####约数的求法: 1.试除法: 由于约数老是成对出现,因此只须要从$1$ ~$\sqrt{n}$。时间复杂度$:O(\sqrt{n})$ ```cpp #include"bits/stdc++.h" #include<time.h> using namespace std;ci

#define N 10086

int a[N];

int n;

int cnt=0;

int main(void) { ios::sync_with_stdio(false); cin>>n;

//clock_t start = clock();

for(int i=1; i<=sqrt(n); ++i) {
	if(n%i==0) {
		a[++cnt]=i;
		if(n/i!=i) a[++cnt]=n/i;
	}
}
for(int i=1; i<=cnt; ++i) cout<<a[i]<<" ";

//clock_t ends = clock();

//cout<<"\n Running time: "<<(double)(ends - start)/ CLOCKS_PER_SEC;

return 0;

}

若是更改题意,给出$l,r$,要求求$l-r$之间的每一个数的正约数集合。那么再用试除法,时间复杂度就为$O(N\sqrt{N})$,变得有点恶心,特别是在$N$很是大的时候。譬如跑$1-100000$。
消耗的时间以下:
![](https://www.cnblogs.com/images/cnblogs_com/morbidity/1464843/t_TIM%e6%88%aa%e5%9b%be20190515202337.png)
运行代码以下:
```cpp
#include"bits/stdc++.h"
#include<time.h>
using namespace std;

#define N 10086

int a[N];

int n;

int cnt=0;

int l,r;

int main(void) {
	ios::sync_with_stdio(false);
	cin>>l>>r;

	clock_t start = clock();

	for(int j=l; j<=r; ++j) {
		memset(a,0,sizeof(a));
		cnt=0;
//		cin>>n;
		for(int i=1; i<=sqrt(j); ++i) {
			if(j%i==0) {
				a[++cnt]=i;
				if(j/i!=i) a[++cnt]=j/i;
			}
		}
		for(int i=1; i<=cnt; ++i) cout<<a[i]<<" ";
		cout<<"\n";
	}
	
	clock_t ends = clock();

	cout<<"\n Running time: "<<(double)(ends - start)/ CLOCKS_PER_SEC;
	return 0;
}

这个时候就要用到另外一种方法。即: 2.倍数法: 对于任意数$x$,$1-N$中以$x$为约数的数就是$x,2x,3x\cdots \lfloor N/x \rfloor*x$。时间复杂度为$O(N \lg N)$ 消耗时间以下: 代码以下:

#include"bits/stdc++.h"
#include<time.h>
using namespace std;

#define N 100860

vector<int> a[N];

int n;

int main(void) {
	ios::sync_with_stdio(false);
	cin>>n;

	clock_t start = clock();

	for(int i=1; i<=n; ++i)
		for(int j=1; j<=n/i; ++j)
			a[i*j].push_back(i);
	for(int i=1; i<=n; ++i) {
		for(int j=0; j<a[i].size(); ++j) {
			cout<<a[i][j]<<" ";
		}
		cout<<"\n";
	}

	clock_t ends = clock();

	cout<<"\n Running time: "<<(double)(ends - start)/ CLOCKS_PER_SEC;
	
	return 0;
}

###GCD和LCM: ####定义: 1.设$a$和$b$是两个整数,若是$d|a$且$d|b$,则称$d$是$a$与$b$的公因子。 2.设$a$和$b$是两个不全为$0$的整数,能使$d|a$和$d|b$成立的最大整数$d$,称它为$a$与$b$的最大公因子,或最大公约数,即$gcd(a,b)$。 3.设$a$和$b$是两个不全为$0$的整数,能使$a|d$和$b|d$成立的最小整数$d$,称它为$a$与$b$的最小公因子,即$lcm(a,b)$。 ####例题: 若是咱们把$A$分解成了$2^{a_1}3^{a_2}5^{a_3}\cdots$,把$B$分解成了$2^{b_1}3^{b_2}5^{b_3}\cdots$如何快速求$gcd(A,B)$。(解以下)

$\because 假设d=gcd(A,B)$ $\therefore d|A,d|B,d最大$ $d=2^{p_1}3^{p_2}5^{p_3}\cdots$ $\therefore p_1 \leq a_1,p_1 \leq b_1$ $p_2 \leq a_2,p_2 \leq b_2$ $\cdots$ $p_1=min(a_1,b_1),p_2=min(a_2,b_2),\cdots$ $又\therefore d=2^{min(a_1,b_1)}3^{min(a_2,b_2)}\cdots$

2.如何快速求$lcm(A,B)$。(解以下)

$把min换成max便可$ $\because 设c=lcm(A,B)$ $\therefore c=2^{max(a_1,b_1)}3^{max(a_2,b_2)}\cdots$

$gcd(A,B)lcm(A,B)=AB=c*d$

###欧几里得算法: 即展转相除法。时间复杂度为$O(\lg n)$。 求$gcd$(给出$a,b$):

$引理:若a>b,则gcd(a,b)=gcd(a-b,b)$ $证:1.显然a-b,b的公因数也是a,b的公因数。$ $2.a,b的公因数也确定是a-b,b的公因数。$ $3.a,b的公因数集合与a,b的如出一辙,最大的固然也同样。(更相减损术)$ $因此解得gcd(a,b)=gcd(a, a\bmod b)=gcd(a\bmod b,b)$ $↰$

$↑$

再证实一下上面的式子?$↑$

$设c(a,b)表示a,b的全部公因数的集合,则gcd(a,b)是r(a,b)中最大的。$ $先尝试证实:a>b时,gcd(a,b)=gcd(a,a-b)(过程在上面)$ $要证这个,只需证r(a,b)=r(a,a-b)$ $假设d是a,b的公因数$ $(那么必然存在两个整数p,q)使得a=pd,b=qd→d(p-q)=a-b$ $a,b的公因数确定是a,a-b的公因数,反之成立$ $gcd(a,b)=gcd(a,a\bmod b)(一直减一个数,余下的即是a\bmod b的余数)$ $举例:$ $a=20,b=3$ $即gcd(20,3)→(17,3)→(14,3)→(11,3)→(8,3)→(5,3)→(2,3)$

Code:

inline int gcd(int a,int b){
	if(b==0) return a;
	return gcd(b,a%b);
	//return b==0 ? a : gcd(b,a%b);  	
}

一条性质: 记$f[n]$为斐波那契数列的第$n$项,则有$gcd(f[a],f[b])=f(gcd[a,b])$。

计算$lcm$: $lcm=a/gcd(a,b)b$ 错误作法: $lcm=ab/gcd(a,b)$(会爆int) ###互质: 若$gcd(a,b)=1$,那么$a\perp b$。 ####基本定理: 1.对于任意两个质数$n,m$,$n\perp m$。 2.对于任意两个相邻的整数$n,m$,$n\perp m$。 3.若$a=1$,对于任意一个天然数$m$,$a\perp m$。 4.一个质数$m$,一个合数$n$,若$n$不是$m$的倍数,$n\perp m$。 ###同余: ####定义: 若两个整数$a,b$,且它们的差$a-b$可以被某个天然数$m$所整除,则称$a$与$b$对模$m$同余。记做$a\equiv b(\bmod m)$,若$m$的值能够由上下文推出时,简写为$a\equiv b$。 ####性质: 1.自反性:$a\equiv a$。 2.对称性:若$a\equiv b$,则%b\equiv a%。 3.传递性:若$a\equiv b,b\equiv c$,则$a\equiv c$。 4.同加性:若$a\equiv b$,则$a+c\equiv b+c$。 5.同乘性:(1)若$a\equiv b$,则$ac\equiv bc$。 (2)若$a\equiv b,c\equiv d$,则$ac\equiv bd$。 6.同幂性:若$a\equiv b$,则$a^n\equiv b^n$。 7.同余式相加:若$a\equiv b,c\equiv d$,则$a\pm c\equiv b\pm d$。 8.同余式相乘:若$a\equiv b,c\equiv d$,则$ac\equiv bd$。 以上性质都是很显然的。 ###容斥原理: ####基本思想: 在计算的时候,老是会有遗漏或者是重复计算的部分,为了使重复计算的部分不被重复计算,能够先算出全部可能,而后再把重复计算的部分减去。 ####举例: 假设某虎有$A$个妹子,cgp有$B$个妹子,他们想要知道他们一共有多少个不一样的妹子(每一个人都有不少,总会有相同妹子)。 先用两个圆圈表示出每一个人所拥有的妹子。 then。 那么红色的部分表明的是两我的都有的妹子。 如何计算他们俩一共有多少种不一样的妹子? 就须要先把他俩所拥有的妹子加起来,而后再减去红色的部分都有的妹子,就是所求。 则$A\cup B=A+B-A\cap B$。 那么再假设某虎依旧有$A$个妹子,cgp依旧也有$B$个妹子,忽然sjp来了,sjp也有妹子,sjp忽然也对这产生兴趣,因而某虎有$A$个妹子,cgp有$B$个妹子,sjp有$C$个妹子,他们想要知道他们一共有多少种不一样的妹子(每一个人都有不少,总会有相同妹子)。 那么咱们先用三个圆圈表示出每一个人所拥有的妹子。 then。 那么蓝色的部分表明的是三我的都有的妹子,绿色的部分表明的是某虎和cgp都有的妹子,橙色的部分表明的是cgp和sjp都有的妹子,紫色部分表明的是某虎和sjp都有的妹子。 那么如何计算他们仨一共有多少种不一样的妹子? 就须要先把他们仨所拥有的妹子都加起来,而后再减去绿色的,紫色的,橙色的部分相同的妹子,最后再加上蓝色的部分的妹子,就是所求。 则$A\cup B\cup C=A+B+C-A\cap B-A\cap C-B\cap C+A\cap B\cap C$。

相关文章
相关标签/搜索