1. 程式人生 > >浴谷夏令營2017.8.1數論的整理

浴谷夏令營2017.8.1數論的整理

之間 poj1006 復雜 趣味 pan 1.2 最大 return 因數

知識點:

1.整數

1.1埃氏篩法:暴力枚舉打表 O(nloglogn)

1.2線性篩法:對於每個數x,遇到x%prime[i]==0的第一個i退出,使得每個合數都被它的最小質因子篩掉 O(n)

例1.1H-合成數poj3292:暴力的一題 篩數打標記O(nlogn)

例1.2求最小質數:平均每O(logn)會出現一個質數,於是暴力即可 O(sqrt(n)logn)

1.3 輾轉相除法

gcd(a,b)=gcd(a-b,b)=gcd(b,a%b) 時間復雜度O(logn)

ab=gcd(a,b)*lcm(a,b)

二進制優化

技術分享
 1 int gcd(int a,int b)
 2 {
 3     if
(!a || !b) 4 return a^b; 5 int i=0,j=0; 6 while(!(a&1)) 7 a>>=1,i++; 8 while(!(b&1)) 9 b>>=1,j++; 10 while(a!=b) 11 { 12 if(a<b) 13 a^=b,b^=a,a^=b; 14 a-=b; 15 while(!(a&1)) 16 a>>=1; 17
} 18 return a<<min(i,j); 19 }
gcd二進制優化

時間復雜度O(logn)不變,常數更小

1.4 拓展歐幾裏得

證明:

要解ax+by=c

設a’=b,b’=a%b,

解出a’x’+b’y’=c

即bx’+(a-[a/b]*b)y’=c

即ay’+b(x’-[a/b]y’)=c

所以x=y‘ y=x‘-[a/b]y‘

遞歸到b==0時,x=1 y=0

技術分享
 1 void exgcd(int a,int b,int c,int &x,int &y,int &p)
 2 {
 3     if(b==0)
 4       if
(c%a==0) 5 { 6 x=c/a; 7 y=0; 8 } 9 else 10 p=-1; 11 else 12 { 13 int xx,yy; 14 exgcd(b,a%b,c,xx,yy,p); 15 if(p==-1) 16 return; 17 x=yy; 18 y=xx-a/b*yy; 19 } 20 }
extgcd

例1.3 gcd區間

題目來源:洛谷1890

dp+暴力

時間復雜度O(n^2logn+m)

例1.4 最大公約數和最小公倍數

題目來源:洛谷1029

質因數分解即可

2.同余

2.1 快速冪

2.2 線性求逆元

i^-1 ≡ -[p/i]*(p%i)^-1

2.3 費馬小定理

若p是質數,則a^p-1 ≡1 (mod p)

2.4 歐拉定理

若(a,p)=1,則a^φ(p) ≡1 (mod p)

2.5 快速求逆元

extgcd或快速冪

例2.1 青蛙的約會

題目來源:poj1061

同余方程,記得取最小解

2.6 中國剩余定理

解方程x ≡ai (mod pi),其中pi兩兩互質。

記qij表示pi在模pj意義下的逆元。

x ≡ Σ(ai*Σ(pj*qji)) (mod p1p2…pn)。

例2.2 Biorhythms

題目來源:poj1006

典型的中國剩余定理

3.積性函數

3.1 積性函數

如果對於任意正整數a,b,都有f(a)*f(b)=f(ab),則稱f為完全積性函數。

如果對於任意滿足gcd(a,b)=1的正整數a,b,都有f(a)*f(b)=f(ab),則稱f為積性函數。

3.2 求歐拉函數

線性篩法即可

例3.1 Visible Lattice Points

題目來源:poj3090

模板題

4.一些

4.1 教堂

有一個n*m的點陣,每個點可以走到8個方向上的點。

水平或垂直方向上相鄰的點之間的距離為1。

你需要從某個點出發,遍歷所有的點並回到起點。

問最短路程。 n,m<=10000。

詭異的一題,分類討論奇偶性

4.2 sumdiv

題目來源:poj1845

分解質因數+等比數列通項公式

4.3 奶牛分廄

題目來源:洛谷1154

很巧妙的做法
a%k==b%k等價於k|(a-b)
然後給所有的xi-xj打標記
之後用類似埃氏篩法的思想從大到小依次篩

從大到小枚舉i,如果i的倍數中存在一個數是因數,那麽i也是因數。

4.4 數列

題目來源:洛谷1062

二進制判斷大小,k進制輸出答案即可

4.5 Hankson的趣味題

篩到45000左右,依次判斷每個質數即可

4.6 GCD SUM

考慮枚舉k,求出gcd恰好為k的數對個數。

不難發現gcd是k的倍數的數對個數是[n/k]2。

把gcd是2k,3k,4k,….的個數扣掉就好啦。

4.7 數三角形

組合數+gcd

浴谷夏令營2017.8.1數論的整理