160 likes | 315 Views
Math. b y music960633. 課程內容. 0. 幾件重要的事情 1. 最大公因數 2 . 質數 3 . 因數分解 4. 排容 原理 5. Homework. 幾件重要的事情. 1. int 的範圍 - 2 31 ~ 2 31 -1 -2147483648 ~ 2147483647 ( 最好背一下 ) 2. long long 的範圍 - 2 63 ~ 2 63 -1 - 9223372036854775808 ~ 9223372036854775807 約 -10 19 ~ 10 19
E N D
Math by music960633
課程內容 • 0. 幾件重要的事情 • 1. 最大公因數 • 2. 質數 • 3. 因數分解 • 4. 排容原理 • 5. Homework
幾件重要的事情 • 1.int的範圍 • -231 ~ 231-1 • -2147483648 ~ 2147483647 (最好背一下) • 2.long long的範圍 • -263 ~ 263-1 • -9223372036854775808~9223372036854775807 • 約 -1019 ~ 1019 • 3. 解題時一定要注意範圍!
最大公因數(GCD) • 前情提要:a%b表示a除以b的餘數 • ex:5%3=2 , 8%5=3 • 輾轉相除法 • gcd(a,b)=gcd(b,a%b) • 一些GCD的性質 • gcd(a,b,c)=gcd(gcd(a,b),c) • gcd(ka,kb)=k*gcd(a,b) • 最小公倍數(LCM)=a*b/gcd(a,b)
最大公因數(GCD) • 實做 • 1. 遞迴 gcd(a,b) = gcd(b,a%b) • 2. 迴圈 while(a!=0 && b!=0) ...
質數 • 前情提要 • 質數定義:大於1,且因數只有1和本身的數 • 質數有無窮多個 • 合數:不是質數的數 • 1不是質數 • [冷知識]2147483647是質數 • 本節內容 • 判斷質數 • 建質數表
判斷質數 • 如何判斷一個數是否為質數? • 1. 從2到n-1全部掃過 • 太慢了 • 2. 只要判斷到就可以了 • why?
建質數表 • 1. 對於每個數都判斷是不是質數 • 2. 利用已知的質數進行加速 • 3. 篩法
建質數表 • 質數篩法 • 想法:先把所有的整數列出來,然後從小到大找出還沒被砍掉的數,每找到一個數就把這個數的倍數全部砍掉 • ex: 2 3 4 5 6 7 8 9 101112 23 57911 235711 235711 235711 235711
建質數表 • 速度比較 • 把MAX_N設成10000000 • 為了秉持實驗精神,結果為分別測5次後取平均的值 • buildPrime_v1 : 8423 ms (對每個數判斷是否為質數) • buildPrime_v2 : 1538 ms(利用已知的質數做判斷) • buildPrime_v3 : 167 ms(篩法) • buildPrime_v4 : 5 ms(篩法優化)
判斷質數 • 如何判斷多個數是否為質數? • 1.每個數都用判斷 • 優點:不使用多餘空間,也沒有預處理的時間 • 缺點:判斷較慢 • 2. 使用篩法,記錄每個數是不是質數 (預處理) • 優點:判斷超快 • 缺點:n到多大,表就要建多大 • 3. 找出1~的所有質數,每個都對n判斷一次 (預處理) • 以上兩者的折衷 • a007
因數分解 • 算數基本定理:每個大於1的正整數有唯一的質因數分解 • ex: 12=22 x 3 • 如何對一個數因數分解? • 從2開始找,如果可以整除n就一直除,並記錄除了幾次 • 如何對很多數因式分解? • 1. 做法同上 (慢) • 2. 建質數表,之後只判質數就可以了
因數個數 • 請問一個數n的因數個數 • 1. 從1到n掃過一遍 • 2. 只要掃到就可以了 • 3. 因數分解 • 那麼多個數的因數個數呢?
排容原理 • |A ∪ B| = |A| + |B| - |A ∩ B| • 翻譯:(A聯集B)的元素個數 =A的元素個數 +B的元素個 數 –(A交集B)的元素個數 • ex: A={1,2,3} |A|=3 B ={2,3,4} |B|=3 A ∪ B={1,2,3,4} |A ∪ B|=4 A ∩ B={2,3} |A ∩ B|=2 4 = 3 + 3 – 2
排容原理 • 應用 • 請問1~100中是4的倍數或6的倍數的數有幾個? • 設A為1~100所有4的倍數的集合,B為1~100所有6的倍數的集合,則所求即是|A∪ B| • 由排容原理,|A ∪ B|=|A|+|B|-|A ∩ B| • |A|=[100/4]=25, |B|=[100/6]=16 ([]為高斯符號 ) • A ∩ B:1~100所有是4的倍數也是6的倍數的集合,也就是1~100所有12的倍數的集合,|A ∩ B|=[100/12]=8 • |A ∪ B|=|A|+|B|-|A ∩ B|=25+16-8=33
Homework • 手寫: • Math • 程式: • 1.gcd • 2. 判斷質數一 • 3. 判斷質數二(a007) • 4. 因數個數一 • 5. 因數個數二 • 6. 區間內倍數個數 • 7.Ad-hoc