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


    顶函数((lceil {x} ceil))、底函数((lfloor {x} floor)):

    常称之为高斯(取整)函数。

    定义:

    顶函数:(geq {x})的最小整数。
    底函数:(leq {x})的最大整数。
    举个例子:

    (1.lceil {1.5} ceil=2)
    (2.lfloor {1.5} floor=1)
    (3.lceil {-1.5} ceil=-1)
    (4.lfloor {-1.5} floor =-2)

    带余除法:

    定义:

    (对于任意整数a,b(ageq b,b eq 0),)(存在q,r,满足a=qb+r(0leq r leq |b|),且q,r唯一)
    我们把a叫做被除数,b叫做除数,q叫做商,r叫做余数。
    可以证明(q=lfloor left (frac {a}{b} ight ) floor,r=a-blfloor left(frac {a}{b} ight) floor)(证明如下)

    (ecause这个是很显然的)
    ( herefore q=lfloor left (frac {a}{b} ight ) floor,r=a-blfloor left(frac {a}{b} ight) floor)

    整除:

    定义:如果(a)能把(b)除尽,余数为0,那么就说是(b)(a)整除,即(a|b)

    整除的性质:

    • 自反性:对于任意(n),有(n|n)
    • 传递性:若(a|b,b|c),那么(a|c)
    • 反对称性:若(a|b,b|a),即(a=b)。(对称性:若(a)满足(bcdots)关系,那么(b)也满足(acdots)关系)
    • (b|a,c|b),则(c|a)。(证明如下)

    (ecause b|a,c|b)
    ( herefore(所以必然存在两个整数x,y)使得a=xb)(b=yc)
    (又 herefore a=xyc)
    (ecause a/c=xy)
    ( herefore c|a)

    • (c|a,c|b),则对任意数(x,y),必有(c |(ax+by)。)(证明如下)

    (ecause c|a,c|b)
    ( herefore (所以必然存在两个整数p,q)使得a=pc)(b=qc)
    (又 herefore c |(pcx+qcy))
    (c|c(px+qy))
    (ecause 两边都有c)
    ( herefore c(px+qy)是c的倍数)
    (又 herefore c|(ax+by))

    • (b|a,a eq 0),则有(|b| leq |a|)。(证明如下)

    (ecause b|a)
    ( herefore (所以必然存在一个整数q)使得a=qb)
    (又 herefore a是b的倍数,|b| leq |a|)

    • (b|a,a eq 0),则(left( frac ab ight)|a)。(证明如下)

    (ecause b|a)
    ( herefore (所以必然存在一个整数q)使得a=qb)
    (又 herefore left( frac {a}{b} ight)=left( frac {qb}{b} ight)=q)
    (ecause a是q的倍数)
    ( herefore q|a)
    (又 herefore left(frac{a}{b} ight)|a)

    • (b|a,c|a,bot c),则(bc|a)。(举例如下)

    (1.当a=12,b=1,c=6时,1|12,6|12,1ot12,6|12。)
    (2.当a=72,b=8,c=9时,8|72,9|72,8ot9,72|72。(自反性:72|72))

    • (a|b,b|a),则(|a|=|b|)。(反对称性)
    • (a|b),对任意整数(c),则(a|bc)。(证明如下)

    (ecause a|b)
    ( herefore b=xa,b是a的倍数)
    (又 herefore乘上任意整数c,bc依旧是a的倍数)
    (又 herefore a|bc)

    • (a|b),对于任意整数(m(m eq0)),则(ma|mb)。(证明如下)

    (ecause 这是显然的)
    ( herefore 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)。(证明如下)

    (ecause p为质数)
    $ herefore a要么是p的倍数,要么pperp a。 ( )又 herefore 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)的正整数集合可写作(:)

    {$p_1^{b_1}p_2^{b_2}cdots p_m^{b_m}$},其中$0leq b_i leq c_i$
    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 using namespace std;

    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<<"
     Running time: "<<(double)(ends - start)/ CLOCKS_PER_SEC;
    
    return 0;
    

    }

    如果更改题意,给出$l,r$,要求求$l-r$之间的每个数的正约数集合。那么再用试除法,时间复杂度就为$O(Nsqrt{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<<"
    ";
    	}
    	
    	clock_t ends = clock();
    
    	cout<<"
     Running time: "<<(double)(ends - start)/ CLOCKS_PER_SEC;
    	return 0;
    }
    

    这个时候就要用到另一种方法。即:
    2.倍数法:
    对于任意数(x)(1-N)中以(x)为约数的数就是(x,2x,3xcdots lfloor N/x floor*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<<"
    ";
    	}
    
    	clock_t ends = clock();
    
    	cout<<"
     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))。(解如下)

    (ecause 假设d=gcd(A,B))
    ( herefore d|A,d|B,d最大)
    (d=2^{p_1}3^{p_2}5^{p_3}cdots)
    ( herefore 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)
    (又 herefore d=2^{min(a_1,b_1)}3^{min(a_2,b_2)}cdots)

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

    (把min换成max即可)
    (ecause 设c=lcm(A,B))
    ( herefore c=2^{max(a_1,b_1)}3^{max(a_2,b_2)}cdots)

    (gcd(A,B)*lcm(A,B)=A*B=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, amod b)=gcd(amod 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,amod b)(一直减一个数,余下的便是amod 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=a*b/gcd(a,b))(会爆int)

    互质:

    (gcd(a,b)=1),那么(aperp b)

    基本定理:

    1.对于任意两个质数(n,m)(nperp m)
    2.对于任意两个相邻的整数(n,m)(nperp m)
    3.若(a=1),对于任意一个自然数(m)(aperp m)
    4.一个质数(m),一个合数(n),若(n)不是(m)的倍数,(nperp m)

    同余:

    定义:

    若两个整数(a,b),且它们的差(a-b)能够被某个自然数(m)所整除,则称(a)(b)对模(m)同余。记作(aequiv b(mod m)),若(m)的值可以由上下文推出时,简写为(aequiv b)

    性质:

    1.自反性:(aequiv a)
    2.对称性:若(aequiv b),则%bequiv a%。
    3.传递性:若(aequiv b,bequiv c),则(aequiv c)
    4.同加性:若(aequiv b),则(a+cequiv b+c)
    5.同乘性:(1)若(aequiv b),则(a*cequiv b*c)
    (2)若(aequiv b,cequiv d),则(a*cequiv b*d)
    6.同幂性:若(aequiv b),则(a^nequiv b^n)
    7.同余式相加:若(aequiv b,cequiv d),则(apm cequiv bpm d)
    8.同余式相乘:若(aequiv b,cequiv d),则(acequiv bd)
    以上性质都是很显然的。

    容斥原理:

    基本思想:

    在计算的时候,总是会有遗漏或者是重复计算的部分,为了使重复计算的部分不被重复计算,可以先算出所有可能,然后再把重复计算的部分减去。

    举例:

    假设某虎有(A)个妹子,cgp有(B)个妹子,他们想要知道他们一共有多少个不同的妹子(每个人都有很多,总会有相同妹子)。
    先用两个圆圈表示出每个人所拥有的妹子。

    then。

    那么红色的部分代表的是两个人都有的妹子。
    如何计算他们俩一共有多少种不同的妹子?
    就需要先把他俩所拥有的妹子加起来,然后再减去红色的部分都有的妹子,就是所求。
    (Acup B=A+B-Acap B)
    那么再假设某虎依旧有(A)个妹子,cgp依旧也有(B)个妹子,突然sjp来了,sjp也有妹子,sjp突然也对这产生兴趣,于是某虎有(A)个妹子,cgp有(B)个妹子,sjp有(C)个妹子,他们想要知道他们一共有多少种不同的妹子(每个人都有很多,总会有相同妹子)。
    那么我们先用三个圆圈表示出每个人所拥有的妹子。

    then。

    那么蓝色的部分代表的是三个人都有的妹子,绿色的部分代表的是某虎和cgp都有的妹子,橙色的部分代表的是cgp和sjp都有的妹子,紫色部分代表的是某虎和sjp都有的妹子。
    那么如何计算他们仨一共有多少种不同的妹子?
    就需要先把他们仨所拥有的妹子都加起来,然后再减去绿色的,紫色的,橙色的部分相同的妹子,最后再加上蓝色的部分的妹子,就是所求。
    (Acup Bcup C=A+B+C-Acap B-Acap C-Bcap C+Acap Bcap C)

  • 相关阅读:
    确保消息产生前数据库操作已提交
    信息披露和公司简介总结
    1、清空所有,给当前添加/2、清空上一个,给当前添加。
    不能作为判断条件的:
    excel表格 函数功能
    一种ui app写法
    正则中使用变量及数组去重的方法
    鼠标锁定(消失),进入无限滚动状态
    transform 的旋转 ,3d效果,要添加3d效果的父级加上景深perspective。 3d效果的容器加上 transform-style:preserve-3d。
    rem布局,在用户调整手机字体大小/用户调整浏览器字体大小后,布局错乱问题
  • 原文地址:https://www.cnblogs.com/morbidity/p/10871967.html
Copyright © 2020-2023  润新知