###頂函數($\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$。 消耗的時間以下:  運行代碼以下: ```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$。