[{"content":"由於 $C^n_r$ 是階乘，直接硬算會算很久，因此預先處理來快速算出組合數尤為重要。\n想法是利用模反元素，將除以 $k!$ 改成乘以 $k!$ 的模反元素。這個方法預處理的時間複雜度為 $O(N)$，之後就能用 $O(1)$ 查詢。\n步驟：\n先開一個陣列紀錄 $0! \\sim n! \\pmod M$ 的值 計算 $n! \\pmod M$ 的模逆元，再開一個陣列紀錄 $k! \\sim 0!$ 的模逆元。\n只要先求出 $(k!)^{-1}$ ，就可以利用 $(k!)^{-1} = (k + 1)!^{-1} \\times (k + 1) \\pmod M$ 來由大到小得出所有階乘的模逆元。 查詢時，只要利用 $C^n_k = n! \\times (k!)^{-1} \\times ((n - k)!)^{-1} \\pmod M$ 在 $O(1)$ 得出。 #define MOD 1000000007LL #define MAXN 200005 #define ll long long using namespace std; ll qpow(ll a, ll b) { ll res = 1; a %= MOD; while (b \u0026gt; 0) { if (b \u0026amp; 1) { res = res * a % MOD; } a = a * a % MOD; b \u0026gt;\u0026gt;= 1; } return res; } ll inverse_mod(int a) { return qpow(a, MOD - 2); } ll fact[MAXN], inv_fact[MAXN]; void precompute_combination() { fact[0] = 1; inv_fact[0] = 1; for (int i = 1; i \u0026lt; MAXN; i++) { fact[i] = fact[i - 1] * i % MOD; } inv_fact[MAXN - 1] = inverse_mod(fact[MAXN - 1]); for (int i = MAXN - 2; i \u0026gt;= 1; i--) { inv_fact[i] = inv_fact[i + 1] * (i + 1) % MOD; } } ll nCr(int n, int r) { if (r \u0026lt; 0 || r \u0026gt; n) return 0; return fact[n] * inv_fact[r] % MOD * inv_fact[n - r] % MOD; } ","permalink":"https://chaoray.github.io/posts/notes/on%E9%A0%90%E8%99%95%E7%90%86%E7%B5%84%E5%90%88%E6%95%B8/","summary":"\u003cp\u003e由於 $C^n_r$ 是階乘，直接硬算會算很久，因此預先處理來快速算出組合數尤為重要。\u003cbr\u003e\n想法是利用模反元素，將除以 $k!$ 改成乘以 $k!$ 的模反元素。這個方法預處理的時間複雜度為 $O(N)$，之後就能用 $O(1)$ 查詢。\u003cbr\u003e\n步驟：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e先開一個陣列紀錄 $0! \\sim n! \\pmod M$ 的值\u003c/li\u003e\n\u003cli\u003e計算 $n! \\pmod M$ 的模逆元，再開一個陣列紀錄 $k! \\sim 0!$ 的模逆元。\u003cbr\u003e\n只要先求出 $(k!)^{-1}$ ，就可以利用 $(k!)^{-1} = (k + 1)!^{-1} \\times (k + 1) \\pmod M$ 來由大到小得出所有階乘的模逆元。\u003c/li\u003e\n\u003cli\u003e查詢時，只要利用 $C^n_k = n! \\times (k!)^{-1} \\times ((n - k)!)^{-1} \\pmod M$ 在 $O(1)$ 得出。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#define MOD 1000000007LL\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#define MAXN 200005\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#define ll long long\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eusing\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enamespace\u003c/span\u003e std;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ell \u003cspan style=\"color:#a6e22e\"\u003eqpow\u003c/span\u003e(ll a, ll b) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ll res \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    a \u003cspan style=\"color:#f92672\"\u003e%=\u003c/span\u003e MOD;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003ewhile\u003c/span\u003e (b \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (b \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            res \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e res \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e a \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e MOD;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        a \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e a \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e a \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e MOD;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        b \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e res;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ell \u003cspan style=\"color:#a6e22e\"\u003einverse_mod\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e a) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e qpow(a, MOD \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ell fact[MAXN], inv_fact[MAXN];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003evoid\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eprecompute_combination\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fact[\u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    inv_fact[\u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e; i \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e MAXN; i\u003cspan style=\"color:#f92672\"\u003e++\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        fact[i] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e fact[i \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e MOD;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    inv_fact[MAXN \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e inverse_mod(fact[MAXN \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e MAXN \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e; i \u003cspan style=\"color:#f92672\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e; i\u003cspan style=\"color:#f92672\"\u003e--\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        inv_fact[i] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e inv_fact[i \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e (i \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e) \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e MOD;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ell \u003cspan style=\"color:#a6e22e\"\u003enCr\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e n, \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e r) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (r \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e||\u003c/span\u003e r \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e n) \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e fact[n] \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e inv_fact[r] \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e MOD \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e inv_fact[n \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e r] \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e MOD;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"O(n)預處理組合數"},{"content":"後綴是甚麼？ 比方說字串 S = banana，S的所有後綴就是：\nbanana anana nana ana na a 將這些後綴排序後：\na ana anana banana na nana Suffix Array就是將字串的每個後綴進行排序後，紀錄該後綴開頭index的陣列：\nint SA[N]; SA[i]; // 表示順序第i個後綴的開頭index 如果 SA[3] = 0 ，表示字典序第 4 小的後綴是從 S[0] 開頭的，也就是 banana。\n例題：算出 s = \u0026quot;aba\u0026quot; 的 SA 陣列\nans SA[3] = {2, 0, 1}; 怎麼找出 Suffix Array ？ 暴力法就是把所有後綴抓出來，然後進行排序。顯然這個方法的時間複雜度是 $O(N^2\\log N)$ (別忘了比較兩個字串要 $O(N)$)。\n所以我們要使用倍增法。倍增法的核心是，如果問題可以被拆解成 1/2 規模的子問題，則先計算該規模的子問題，然後再求出原本的問題。也就是說，可以先解決 n=1 時的問題，接著解決 n=2、解決 n=4、解決 n=8\u0026hellip;，最後求出原本的問題。\n我們不一次比對整個字串，而是長度翻倍地比（1 $\\rightarrow$ 2 $\\rightarrow$ 4 $\\rightarrow$ 8 \u0026hellip;）。\n假設我們想比較長度為 2 的子字串：\n我們不用逐字元比較，而是把長度 2 拆成 「前 1 個字元」 與 「後 1 個字元」。 因為前 1 個字元的排名我們上一輪已經算過了，所以只需拿兩個數字（雙元組 (第一部分排名, 第二部分排名)）出來比大小即可 我們以 S = aba 為例，以下是 S 的所有後綴：\naba ba a 首先看長度為 1 的字串，並排序他們並表示成一個 Rank 陣列(Rank[i] 表示以 S[i] 開頭的後綴的排名)：\n索引 長度 1 的字串 排名(Rank陣列) 0 \u0026lsquo;a\u0026rsquo; 0 1 \u0026lsquo;b\u0026rsquo; 1 2 \u0026lsquo;a\u0026rsquo; 0 我們接著看長度為 2 的字串：\nab ba a_ 由於第三個字串長度不足二，以_表示空位。觀察一下，要比較 aba 這個字串前兩個字 ab 時，會發現 ba 是 aba 的後綴，那麼是不是可以利用我們先前處理過 ba 中第一個字 b 的排名，來求出 aba 前兩個字 ab 的排名？\n所以可以這樣想：把 ab 拆成 a 和 b，然後分別比較 a 和 b 與其他字串的排名，來求出整體 ab 的排名，也就是前面提到的 pair。\n那要怎麼快速建立這個 pair？可以利用前半段的 Rank[當前位置] 和後半段的 Rank[當前位置 + w] 組成（如果超出字串範圍，排名算 -1），w 表示我們要比的字串長度的一半。\n以下是這些長度為 2 的字串的 pair：\nab -\u0026gt; (0, 1) ba -\u0026gt; (1, 0) a_ -\u0026gt; (0, -1) 如果使用 std::sort 對這些 pair 進行排序，需要花費 $O(N \\log^2 N)$。但是可以發現，我們在排序的東西(排名)範圍都落在 -1~N 之間，所以理想上，可以使用 Counting Sort 來實現 $O(N)$ 排序，所以時間複雜度變成 $O(N \\log N)$。\nSample Code $O(N \\log^2 N)$ 版本：\nvector\u0026lt;int\u0026gt; build_sa(const string\u0026amp; s) { int n = s.length(); vector\u0026lt;int\u0026gt; sa(n), rk(n), next_rk(n); // 1. 初始化：長度為 1 的排名 (直接用 ASCII 碼) for (int i = 0; i \u0026lt; n; i++) { sa[i] = i; rk[i] = s[i]; } // 2. 倍增迭代：w 為半長度 (1 -\u0026gt; 2 -\u0026gt; 4 -\u0026gt; 8...) for (int w = 1; w \u0026lt; n; w \u0026lt;\u0026lt;= 1) { // 自訂比較函式：比對雙元組 (rk[i], rk[i + w]) auto cmp = [\u0026amp;](int i, int j) { if (rk[i] != rk[j]) return rk[i] \u0026lt; rk[j]; int ri = (i + w \u0026lt; n) ? rk[i + w] : -1; int rj = (j + w \u0026lt; n) ? rk[j + w] : -1; return ri \u0026lt; rj; }; // 直接用std::sort進行排序 sort(sa.begin(), sa.end(), cmp); // 3. 根據排序結果更新下一輪的排名 next_rk[sa[0]] = 0; for (int i = 1; i \u0026lt; n; i++) { next_rk[sa[i]] = next_rk[sa[i - 1]] + (cmp(sa[i - 1], sa[i]) ? 1 : 0); // 如果排名還是一樣，則不改變，否則將排名往後挪 } rk = next_rk; // 若排名均不相同，代表排序已完全確定，可提早結束 if (rk[sa[n - 1]] == n - 1) break; } return sa; } $O(N \\log N)$ 版本：\nvector\u0026lt;int\u0026gt; build_sa(const string\u0026amp; s) { int n = s.length(); int m = 128; // 字元集大小 (ASCII 碼最大值) vector\u0026lt;int\u0026gt; sa(n), rk(n), tp(n), cnt(max(n, m), 0); // 1. 初始：對長度為 1 的字元做計數排序 (O(N)) for (int i = 0; i \u0026lt; n; i++) cnt[rk[i] = s[i]]++; for (int i = 1; i \u0026lt; m; i++) cnt[i] += cnt[i - 1]; for (int i = n - 1; i \u0026gt;= 0; i--) sa[--cnt[rk[i]]] = i; // 2. 倍增迭代：w 為 1 -\u0026gt; 2 -\u0026gt; 4 -\u0026gt; 8... for (int w = 1, p = 0; p \u0026lt; n; w \u0026lt;\u0026lt;= 1, m = p) { // --- 第一步：直接利用上一輪 SA 整理第二關鍵字 (O(N)) --- p = 0; // 超出範圍的位置 (第二關鍵字為 -1) 最優先 for (int i = n - w; i \u0026lt; n; i++) tp[p++] = i; // 依照上一輪 SA 順序，放入其餘第二關鍵字 for (int i = 0; i \u0026lt; n; i++) { if (sa[i] \u0026gt;= w) tp[p++] = sa[i] - w; } // --- 第二步：對第一關鍵字做計數排序 (O(N)) --- fill(cnt.begin(), cnt.begin() + m, 0); for (int i = 0; i \u0026lt; n; i++) cnt[rk[tp[i]]]++; for (int i = 1; i \u0026lt; m; i++) cnt[i] += cnt[i - 1]; for (int i = n - 1; i \u0026gt;= 0; i--) sa[--cnt[rk[tp[i]]]] = tp[i]; // --- 第三步：重新更新 Rank 陣列 (O(N)) --- swap(rk, tp); rk[sa[0]] = 0; p = 1; // p 記錄當前有多少種不同的排名 for (int i = 1; i \u0026lt; n; i++) { // 比較 sa[i] 和 sa[i-1] 的第一與第二關鍵字是否完全一樣 bool is_same = (tp[sa[i]] == tp[sa[i - 1]]) \u0026amp;\u0026amp; ((sa[i] + w \u0026lt; n ? tp[sa[i] + w] : -1) == (sa[i - 1] + w \u0026lt; n ? tp[sa[i - 1] + w] : -1)); rk[sa[i]] = is_same ? p - 1 : p++; } } return sa; } ","permalink":"https://chaoray.github.io/posts/notes/suffix-array/","summary":"\u003ch2 id=\"後綴是甚麼\"\u003e後綴是甚麼？\u003c/h2\u003e\n\u003cp\u003e比方說字串 \u003ccode\u003eS = banana\u003c/code\u003e，S的所有後綴就是：\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebanana\nanana\nnana\nana\nna\na\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e將這些後綴排序後：\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ea\nana\nanana\nbanana\nna\nnana\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSuffix Array就是將字串的每個後綴進行排序後，紀錄該後綴開頭index的陣列：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e SA[N];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSA[i]; \u003cspan style=\"color:#75715e\"\u003e// 表示順序第i個後綴的開頭index\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果 \u003ccode\u003eSA[3] = 0\u003c/code\u003e ，表示字典序第 4 小的後綴是從 \u003ccode\u003eS[0]\u003c/code\u003e 開頭的，也就是 \u003ccode\u003ebanana\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e例題：算出 \u003ccode\u003es = \u0026quot;aba\u0026quot;\u003c/code\u003e 的 SA 陣列\u003c/p\u003e\n\u003cdetails class=\"alert alert-spoiler\"\u003e\n    \u003csummary class=\"alert-heading\"\u003e\n      \u003cspan class=\"alert-icon\"\u003e\u003csvg class=\"octicon octicon-eye-closed mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\" fill=\"currentColor\"\u003e\u003cpath d=\"M8.22 1.754a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368ZM8.22 1.754A12.078 12.078 0 0 1 1.164 8c.978 2.168 2.726 3.987 4.908 5.246a.75.75 0 0 0 .684 0C8.932 11.987 10.68 10.168 11.658 8 10.68 5.832 8.932 4.013 6.752 2.754a.75.75 0 0 0-.684 0L2.772 5.326a.75.75 0 0 0-.126.167L8.22 1.754ZM1.5 8c0-.825.342-1.613.95-2.233A12.078 12.078 0 0 0 1.164 8c.978 2.168 2.726 3.987 4.908 5.246a.75.75 0 0 0 .684 0C8.932 11.987 10.68 10.168 11.658 8 10.68 5.832 8.932 4.013 6.752 2.754a.75.75 0 0 0-.684 0C3.896 4.013 2.148 5.832 1.17 8ZM8 10.5a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5ZM8 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/span\u003eans\u003c/summary\u003e\n    \u003cdiv class=\"alert-content\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSA[\u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e {\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e};\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n  \u003c/details\u003e\u003ch2 id=\"怎麼找出-suffix-array-\"\u003e怎麼找出 Suffix Array ？\u003c/h2\u003e\n\u003cp\u003e暴力法就是把所有後綴抓出來，然後進行排序。顯然這個方法的時間複雜度是 $O(N^2\\log N)$ (別忘了比較兩個字串要 $O(N)$)。\u003c/p\u003e","title":"Suffix Array"},{"content":"羽球初級 課程資訊\n授課教授：李文心\n實得等第：A+\n甜度指數：⭐⭐⭐⭐⭐\n涼度指數：⭐⭐⭐⭐⭐\nOffice Hour：事前預約\n分數組成\n個人技巧測驗 40%\n出席學習態度 30%\n單雙打排名賽練習 30%\n大推，老師人很好，上課就先說自己A+率過90，但她沒在怕，愛死。\n加簽條件老師會先問你有沒有基礎，以及你有沒有帶球拍跟球(我忘記了跟別人借球，真的很謝謝他)，如果有參加過系羽會優先選上，若有基礎建議直接衝。\n簽到是紙本簽到，每堂課開頭會有個表格給你打勾，如果晚到可以找助教補簽，老師基本上不太在意、好像也抓不太到遲到這件事，所以晚個幾十分鐘應該無所謂，不過免費的球場有不打的理由嗎？\n考試有考低手發球、高遠、Z字步這三個，還有單雙打的比賽。老師說他會用初學者的角度平等審視所有人，基本上動作對了氣勢有了，再加上有界內，就會給高分。不過我發球、高遠不是出界就是掛網，但還是拿到很高的分數，愛了。\n在期中考、期末考周，老師會自主放假一周，即當周不上課，但你想打球仍然可以到上課地點打，愛死，免費的球場有不打的理由嗎？除了上課，其他認真的羽球問題也可以問老師，他會很認真的示範動作以及回答你訓練方法，助教是校隊的也很熱心，上課都會下去問每個人有沒有問題。\n排名比賽老師說志在參加，排名之間的分數差距不會很大。一開始老師會教你根據自己的實力分組，我都挑比自己實力弱的組別參加炸魚，課上有個外國人一直很賭爛我為甚麼在它們組，我說我想要 easy life，最後就是拿單雙打的分組第一。\n課堂上也有那種真強者在打球，我高遠都被他們拉爆嗚嗚，他們到底來初級幹嘛的。課程整體氣氛偏開朗，最後老師會有個大合照環節，挺好笑的。\n總而言之就是李文心一生推。\n英文二 課程資訊\n授課教授：柏毅嘉 Guy Beauregard\n實得等第：A\n甜度指數：⭐⭐\n涼度指數：⭐\nOffice Hour：事前預約\n分數組成\nAttendance and participation 10%\nQuizzes 20%\nWriting exercises 30%\nGroup presentation 40%\n加簽難易度 不知道，我是因為上學期的英文一直接獲得英文二，還自動換了老師。\n出席要求、請假機制 每堂課開始老師會拿著你學期初寫的自我介紹小卡片點名，只要老師手上還拿著你的卡片就不算遲到，如果有忘記拿東西可以先跟他說再跑走。\n關於請假，不論你發生了甚麼事，都一定要寫信讓他知道你要請假，不然缺席會扣很多分。\n老師、助教如何 老師是外國人，不過沒什麼口音，主要使用英文，中文通常只會說好不好三個字。人很和善，下課會到處走動隨機抓人聊天，他會很認真記住每個人的名字。\n他自己不喜歡用麥克風，導致他常常覺得電風扇很吵要關起來，同時他也不喜歡有人上課在用手機平板，被他注意太多次會被警告。另外，他很討厭使用 NTU COOL，請做好 COOL 上沒有任何東西就獲得等第的準備。手寫的字特別抽象，但板書就沒問題，超級怪，手寫字建議搭配助教或教授閱讀，雖然他自己有時也看不懂。\n有趣的是，我感覺教授比我這個台灣人還要了解台灣，許多我們在課本上看過的歷史事件(如228)他都很了解，還跟我說嘉義其實是全台灣平地最冷的地方，驚呆了。\n有任何問題我都建議直接跟教授說，他不太在意你問的問題是不是他講過了或者怎樣怎樣的。他喜歡別人直接叫他Guy，因為他說在國外的文化中，通常是叫老師 Teacher + Surname ，但台灣一堆學生都會叫他 Teacher Guy。\n助教蘇媺(ㄇㄟˇ)人真的很 easy going，有任何問題基本上比較站在學生那邊，寫信也是都秒回，也很常跟我們抱怨教授怎樣怎樣，我還記得她跟修過英文一的學生聚在一起臭英文一的教授，真的很好笑。\n但她感覺很累(?)，因為我們的Writing Exercise、報告都一定要跟她討論過才能給教授看，而且她還有同時修教授的另一門課，是被教授認證的過勞，不時還會獲得教授的道歉。\n課程內容、教材 Schedule Part One: Skills Week 1 (February 26): Introduction to course objectives; writing exercise #1 Week 2 (March 5): What is academic writing? Reading: Jane E. Aaron handout: “Features of Academic Writing” (pages 3-9) Week 3 (March 12): Integrating sources; Quiz #1 Reading: Jane E. Aaron handout: “Integrating Sources” (pages 133-141) Week 4 (March 19): Documenting sources; Quiz #2 Reading: Pearson Guide to the 2021 MLA Handbook handout (pages 8-9 and pages 37-41; you can also consult the sample Works Cited list if you wish on pages 47-53); plus details about the course package Part Two: Texts Week 5 (March 26): Reading: “The Address of Personally Attending the Opening of the 228 Monument”; “The 228 Monument Inscription”; plus presentation guidelines and topics Week 6 (April 2): Review; plus presentation sign-up Week 7 (April 9): Reading: “We Are Homosexuals, We Love You!”; “Gay Rights Activists Attack Obscenity Law” Week 8 (April 16): Reading: “Film Addresses Taiwan’s Lack of Respect for Animals”; plus screening of Pick of the Litter (film) Week 9 (April 23): Writing exercise #2 due at beginning of class Reading: “Toward a Nuclear-free Homeland”; plus screening of Voices of Orchid Island (film) Week 10 (April 30): Reading: “Shelter from the Storm”; plus screening of Surviving Morakot (film) Week 11 (May 7): Reading: “The Green ‘Preacher’”; plus screening of The Age of Awakening (film) Week 12 (May 14): Review; writing exercise #3 due at beginning of class Part Three: Presentations Week 13 (May 21): Group presentations Week 14 (May 28): Group presentations Week 15 (June 4): Group presentations Week 16 (June 11): Wrap-up and review 前四周有關 Jane E. Aaron 的教材老師會印好給你，後面 W5~W12 會需要你去影印店自行購買，已經印好了去付錢就行。可以看出教學內容跟台灣人比較有關係，主題很廣闊也很開放，有種開始關懷這片土地的感覺，至少我很喜歡這樣，已經比英文一好太多了。\n作業、學習時數 接近報告的時候才會花一堆時間(約6+小時)，平時每周只要大約花十分鐘把當周的文章看過、劃過筆記就可以了。小考前只要認真把教材讀過一遍就好。\n此外還會有三次的 Writing Exercise，沒有題目限制，不過會希望你以一篇、課內的文章為主題，寫出你自己對於這篇文章的詮釋與心得，重點是要展現出你在前四周學到的 Academic Writing、Text Reference 的知識還有你個人的解讀。但我想說，你教材都給報刊雜誌是要有甚麼個人解讀，很解好嗎\u0026hellip;。\n考試、報告 沒有期中期末，但老師期中期末周會問你還活著嗎。前四周有兩次小考，考十題、全選、每題一分，不過基本都很水，第一次小考老師因為其中一題太多人錯就全班加一分，我在兩次小考獲得了19/20的好成績，你也來試試吧。\n報告就是標準的大型報告，會需要你花至少兩周的時間在準備，大家都很卷。老師會提供6個題目，每個題目會有不同的報告日期，試試看在前幾周觀察出會帶飛你的組員吧。\n報告題目\nMay 21: What do we need to know about 228 Peace Park / 228 Monument(s) / the 228 Memorial Museum(s) in Taipei?\nMay 21: What do we need to know about LGBTQ+ rights / Pride Parade(s) in Taiwan?\nMay 28: What do we need to know about animal rights in Taiwan?\nMay 28: What do we need to know about the rights of Indigenous peoples and/or the topic of nuclear waste in Taiwan?\nJune 4: What do we need to know about Typhoon Morakot and its aftermath in Taiwan?\nJune 4: What do we need to know about environmental activism in Lukang and/or elsewhere in Taiwan and/or around Asia?\n報告須知\nFE II - GUIDELINES FOR GROUP PRESENTATIONS\nOverview:\nThe group presentations will be your final project for this course. They are a chance for you to apply the skills you have learned about academic writing, including integrating sources and \u0026gt; documenting sources; they are also a chance to do some research to find new sources and thereby extend your understanding of the topics that we will discuss in the section on “Texts.”\nYour group presentations will be scheduled on May 21, May 28, and June 4 depending on your presentation topic. As you prepare, please follow the guidelines listed below.\nGuidelines:\nFor this exercise, please work in groups of five. Based on our current enrollment numbers, one group will have four members. Ask yourselves: what do your classmates need to know about the topic? Try to find, integrate, and present the following information and reflections as clearly as you can: A short explanation of the topic (example: what is the 228 Incident?) If applicable, some historical grounding (example: when did Typhoon Morakot hit Taiwan?) Some reflections on why this topic could—or should—be important to us (example: why should we care about environmental activism in Taiwan or around Asia?) Prepare a one-page handout (single-sided or double-sided). This handout should include your full names and student numbers, the topic of your presentation, and an outline of your major points. There are 29 students plus one professor and one TA in our class, so when you prepare copies please plan accordingly. In addition, you are also welcome to present extra materials (including visual materials and/or sound files) if you think they are helpful. In the past, students have found it helpful to use powerpoint or similar software to integrate these additional materials into their presentations. Practice your presentation. Try to make your presentation at least 20 minutes and no more than 30 minutes long. Do your best to follow the suggestions provided by the TA Leah. Make sure everyone has a chance to speak. Be prepared to answer questions based on the materials you’ve presented. Regarding use of generative AI platforms: Each group must submit a short statement, written in English or in Chinese and printed and signed by all group members, indicating whether \u0026gt; generative AI platforms were used at any time in preparing for this presentation. If the answer is \u0026ldquo;no,\u0026rdquo; please write: \u0026ldquo;No gener ative AI platforms were used in preparing for this \u0026gt; presentatiion.\u0026rdquo; If the answer is \u0026ldquo;yes,\u0026rdquo; please provide a precise description of which platform was used, how it was used, and for what exact purposes. This signed statement must be submitted \u0026gt; to the instructor or to the TA before the presentation begins. As you prepare; please remember a basic point we learned about documenting sources: academic work requires you to properly credit all sources you consult, summarize, paraphrase, or quote as you prepare your work. Giving credit to others is an important part of being successfu at a research university ssuch as NTU\u0026ndash;and we want you to be successful! Please note however that failure to provide this signed statement or failure to properly credit sources could llead to a failing grade for this assignment and/or for this course. Have fun! I hope this exercise provides you with a chance to get to know some of your classmates, to be creative, to learn new things, to properly credit your sources, and to practice using university-level English. Good luck! 考古題 找不到，或許你可以找看看這個網頁\u0026hellip;？\nGo find /FE2_Quiz1.txt and /FE2_Quiz2.txt\n其他 很累但也確實學到不少東西，我的台灣價值又提升了哈哈哈。\n微積分3 / 微積分4 課程資訊\n授課教授：蔡國榮\n實得等第：B+/A+\n甜度指數：★\n涼度指數：★\nOffice Hour：Monday 10(17:30~18:20) | Wednesday 6,7(13:20~15:10) | Friday 6,7(13:20~15:10)\n分數組成\nQuizzes 20%\nAssessment 30% (Capped at 30%)\nFinal Exam 50%\n加簽難易度 不知道，直接選就上了 😋。\n出席要求、請假機制 最好給我去喔，國榮的課還不上是怎樣？？\n老師、助教如何 國榮的偉大毋需多言。\n課程內容、教材 Calculus 3\nIntroduction to Curves and Surfaces Partial Derivatives Chain Rule and Directional Derivatives Optimizations in Multivariables Multiple Integrations Calculus 4\nLine integrals Green’s Theorem and Conservative vector fields Surface integrals and Flux Stokes’ and Divergence Theorem Series : definition and convergence tests Power series : radius of convergence and their calculus Taylor\u0026rsquo;s theorem and its applications 自製教材，國榮的偉大毋需多言。\n作業、學習時數 每周會有一份作業，難度中等偏上，通常要花 2~3 小時寫，小考前我還會花約3小時刷考古，期考會花8+小時刷考古。所以每周大概是 3+ 小時的學習時間。\n國榮的偉大毋需多言。\n考試、報告 只有兩次小考與最後的期考，微三期考真的很難\u0026hellip; 😥。但微四好像老師放水了，所以我拿了 A+，不然根據國榮所述，大概有 20~30% 的學生在微四會被當掉。\n國榮的偉大毋需多言。\n考古題 微積分統一教學網 - 歷屆考古題\n其他 翹棍請放過我。\n國榮一生推，國榮的偉大毋需多言。\n普通物理學甲下 課程資訊\n授課教授：楊佩芸\n實得等第：A+\n甜度指數：★\n涼度指數：★\nOffice Hour：事前預約\n分數組成\n作業 35% 小組討論：出席 7% + 同儕互評 3%\n期中+期末 55%\n期末評鑑 1%(?)\n加簽難易度 基本上有簽就上。\n出席要求、請假機制 每堂課會有不固定數量的 Zuvio Pop Quiz 當作點名。請假不需經過老師同意也不用真的去系統請假，但是需要在下一堂課課間去找老師回答缺課那堂的 Zuvio 問題來拿回失去的出席分數。\n老師、助教如何 老師人真的很好了，但考試出的題目是真的不好，期中平均 59.99、期末 78 。助教給到ㄆ級分，基本上只有助教課及要分環節會出現在你的視野裡，改考卷的速度真的很慢，考試後兩周成績還沒出。但是要分只要合理都會給，以及給分挺寬鬆的。\n課程內容、教材 Schedule 第1週 2/25 Introduction; Electric Charge and Electric Field 第2週 3/4, 3/6 Gauss’s Law 第3週 3/11, 3/13 Electric Potential 第4週 3/18, 3/20 Capacitance and Dielectrics 第5週 3/25, 3/27 Current, Resistance, and Electromotive Force 第6週 4/1 Direct-Current Circuits 第7週 4/8, 4/10 Magnetic Field and Magnetic Forces 第8週 4/15, 4/17 Sources of Magnetic Field; 4/17 Midterm 第9週 4/22, 4/24 Electromagnetic Induction 第10週 4/29 Inductance 第11週 5/6, 5/8 Alternating Current 第12週 5/13, 5/15 Electromagnetic Waves 第13週 5/20, 5/22 The Nature and Propagation of Light 第14週 5/27, 5/29 Interference/ Diffraction 第15週 6/3, 6/5 Special Relativity 第16週 6/10, 6/12 Brief Introduction to Quantum Computation; 6/12 Final 老師自己手寫教材，會放在 COOL 上，很感動這個 AI 時代還有願意手搓的老師😭😭，老師的字好好看，另外會有每周的錄影放在 COOL 上。\n作業、學習時數 作業約是兩周一次的量，每次約4~6題，不過每題都@#\u0026amp;%!難寫，通常會花 3 個多小時在寫作業，題目很需要創意思考以及活用課堂上的知識。此外，有關分組，是在開學找好組，然後每次作業會需要你們組聚在一起討論作業內容，雖然一堆人聚在一起討論了，但題目難度還是會讓大家意見不一致😥。\n考試、報告 只有期中期末。題外話，期中佩芸出了一份題目超級多的考卷，導致大部分人是(包含我)既寫不完又看不懂題目，期末佩芸說會收斂，也確實把大刀收起來了，愛佩芸 😍。\n考古題 老師反對考古，所以只能靠學長姐家傳\u0026hellip;想要的來找我拿吧\u0026hellip;。\n其他 B-以上的等第線都會往上拉，想要拿A+需要95分。還有老師會唱歌\u0026hellip; @sheepsfairygarden。\n數學沙龍與生涯探索 課程資訊\n授課教授：合授\n實得等第：Pass\n甜度指數：★★★★★\n涼度指數：★★★★★\nOffice Hour：無\n分數組成\n無\n加簽難易度 不知道\n出席要求、請假機制 每次演講會有點名表，也不知道沒點到會怎樣。\n老師、助教如何 每位講者做的研究、人生經歷都很有趣，雖然我好像沒什麼學到。\n課程內容、教材 演講 PPT\n作業、學習時數 學期末會有一個作業需要你寫，內容是最有收穫的演講以及你個人的履歷。\n考試、報告 無\n考古題 無\n其他 每次都有東西吃，愛講座。\n毒道之處∼看不見的危機! 課程資訊\n授課教授：合授\n實得等第：A\n甜度指數：★★★\n涼度指數：★★★★\nOffice Hour：無\n分數組成\n出席率 15%\n課程參與 25%\n期末報告 40%\n期末影片 20%\n加簽難易度 很難簽，不過我初選選上還被抽到加簽？\n出席要求、請假機制 每次上課會有 Zuvio 點名。\n老師、助教如何 沒什麼互動不知道。但有些老師講話很像在話家常，特別催眠。\n課程內容、教材 Schedule 第1週 2/23 課程簡介/後毒物時代的恐慌 第2週 3/2 你喝的水安全嗎? - 眼不見為淨？ 第3週 3/9 吐司片上的萬花叢 - 淺談黴菌毒素與食物污染 第4週 3/16 卡路里毒性效應-燃燒脂肪之後 第5週 3/23 有機不有機 – 土壤 生態 與農藥 第6週 3/30 細胞不死，不死細胞-談環境因子與惡性腫瘤 是吃藥還是服毒 - 藥物副作用 第7週 4/6 民俗掃墓節遇例假日補假 第8週 4/13 期中考週 第9週 4/20 無法呼吸的空氣(PM2.5,奈米粒子,環境荷爾蒙，重金屬) 第10週 4/27 美麗的真相 - 化妝品與保養品 第11週 5/4 毒品 - 毒品開趴，濫用之後 第12週 5/11 為什麼加工食品的成分好複雜 ? 食品添加物是必要之害 ? 第13週 5/18 有機溶媒 - 溶化污垢，融化健康！ 第14週 5/25 是吃藥還是服毒 - 藥物副作用 第15週 6/1 人如其食-環境, 飲食與基因調控 第16週 6/8 期末考週 每次講者自備 PPT 還有課程錄影上傳到 COOL，小心有些講者的 PPT 裡面只有圖片。\n作業、學習時數 課前會有 Zuvio 題目，同時課中會不定時出現一些題目要寫，最後上完課會有課後回饋。\n考試、報告 期末報告分成個人和團體報告兩種，分組是期初隨機分配，所以不存在找組員這件事。\n先說個人報告，需要你針對其中一個上課主題做研究，課程會提供以前學長姐的範本，所以不是特別難。\n團體報告則需要組別針對其中一個上課主題製作一個影片，這點就很吃組員了\u0026hellip;。\n考古題 無\n資料結構與演算法 課程資訊\n授課教授：林軒田/蔡欣穆\n實得等第：A\n甜度指數：★\n涼度指數：★\nOffice Hour：課後/事前預約\n分數組成\n程式 20%\n手寫 10%\n活動 10%\n期中 30%\n期末 30%\n加簽難易度 一類沒啥好說的。\n出席要求、請假機制 無。\n老師、助教如何 先說林軒田教授學長，我很喜歡他在課堂最後都會有個 fireside chat ，聊聊他對資訊系學生的問題，還有分享自己的個人經驗。上課方式也很輕鬆幽默，但是他會一直臭所有政治人物 🤣，每次上課都在開地圖炮。\n蔡欣穆教授上課一樣蠻有趣的，而且他的直播設備很齊全，甚至還有即時翻譯英文，不愧是 NASA 老師。我很喜歡他特意在教材裡面塞空間讓我們可以做筆記，不過教授本身的筆記是有點過於難懂了\u0026hellip;。\n助教團隊由 22 位助教組成，會開一個 DSA 專屬 DC 群，可以在裡面自由發問，只要 tag 就是秒回，所以不論手寫還是程式題都可以及時得到各種回饋和幫助。要分方面，一樣是有理一定給，我自己覺得助教不太會亂改或改錯，就是跟助教吵一吵會發現自己錯的那種。\n課程內容、教材 Schedule\nW1 Introduction, Algorithm\nW2 Data Structure, Analysis Tools\nW3 More Analysis Tools, Linked List\nW4 Stack, Queue\nW5 Tree, Binary Tree\nW6 Heap, Binary Search Tree\nW7 Comparison Sort\nW8 Midterm\nW9 String Matching\nW10 Graph, BFS, DFS\nW11 Disjoint Union\nW12 RB-Tree\nW13 B-Tree\nW14 Hashing\nW15 Linear Sorting\nW16 Final\n除了 PPT 還有課程錄影會上傳到 COOL ，此外也有過往課程的錄影。指定用書就是鼎鼎大名的 CLRS ，真的很難啃。後來我都是看印度人的影片才把紅黑樹、BTree、Dynamic Hash Table那些搞懂。\n作業、學習時數 萬惡痛苦循環\n每兩周會有一份大作業，作業分為手寫和程式兩部分，各兩大題。手寫通常會分為很多子題，其中就是要寫數學證明、 寫pseudo code 、為甚麼你的 code 是對的、為甚麼你的 code 符合題目的複雜度\u0026hellip;等等，非常需要動腦，有好幾題我想不出來都跑去問 Gemini 。\n程式題則需要你活用上課的知識，搭配許多通靈才能寫出來，不過越往後教資料結構越複雜，題目反而偏向裸題，但是手刻那些資料結構 紅黑樹 真的會累死人。\n此外還有 HW0 、 Mini-Homework 和 Inclass-Homework。HW0 是要讓你測試自己有沒有足夠的程式能力可以修這門課， Mini-Homework 則偏向寫大作業前的程式練習，先讓你複習上課教的資料結構，Inclass-Homework 則是在後半學期才會出現，都是讓你上課練習的簡單題目。\n個人體感難度：手寫 \u0026gt;= 程式 \u0026gt; Mini-HW \u0026gt; HW0 \u0026gt; Inclass-HW\n考試、報告、活動 有期中期末，都頗難，每年的題目都會更新，可以帶不定張數的大抄，強烈建議把作業、考古的解答印出來帶進去。\n考古題 我們這屆有提供 2024 與 2025 這兩年考古，再加上我莫名其妙獲得 2023 年的考古，基本上已經寫不完了。所以可以跟助教要要看，應該官方會統一給。\n其他 套用一句軒田學長說的話：\n給資訊系的同學們：努力加油\n給想加選的同學們：審慎考慮\n這門課確實很硬，每周都要花約 20 小時在寫作業，作業是真他媽難寫，考試也是真他媽難寫，東西也是真他媽難懂，不過習慣了好像也還好，就只是循環而已。\n對我來說，由於我之前已經學過比較基礎的資料結構還有演算法，概念並不是特別難懂。而新學的東西像是萬惡的紅黑樹等，也沒說到特別難。\n我認為這門課的難點在於考試會需要你去活用資料結構，辨識出這題的 pattern ，然後想辦法把程式塞進題目給的時間複雜度內。因此，有策略的考試(如先找簡單或會寫的題目)，還有審題(如從時間複雜度通靈解法)對想要拿高分是很重要的。\n最後就是看著那些強者在天上飛阿\u0026hellip;數學 big O 證明我都寫不出來 😭😭😭。\n比特幣與數據分析 課程資訊\n授課教授：廖世偉\n實得等第：A+\n甜度指數：★★★★★\n涼度指數：★★★★\nOffice Hour：無\n分數組成\n作業 40%\n期中 20%\n期末 20%\nFinal Project 20%\n加簽難易度 不知道，初選選上的。\n出席要求、請假機制 無。\n老師、助教如何 跨領域、玩真的、做中學、躺著賺，小步快跑、快速迭代、與時俱進。\n課程內容、教材 Schedule 1. We\u0026#39;ll teach you how to find edge. Without edge, there is no arbitrage. Once you master the arbitrage, you need to agentize the process. The overarching theme of this course is the 3A above: Advantage --\u0026gt; Arbitrage --\u0026gt; Agent. 2. We\u0026#39;ll teach you data-driven decision and quants. 3. We\u0026#39;ll focus on the Web3 example. We\u0026#39;ll introduce students to the world of Decentralized Finance (DeFi) and explore the evolving blockchain landscape: 3A. Blockchain Basics 3B. Smart Contract Programming 3C. Smart Contract Security 3D. Common ERC Standards and EIPs 3E. Overview of Decentralized Finance (DeFi) 3F. Advances and Innovations in DeFi 會上傳課程錄影、PPT到 COOL 上。\n作業、學習時數 有分小 project 與寫題目，都不難。\n考試、報告 🤫\n考古題 想要的來跟我拿。\n其他 我認為這門課認真聽是能聽到很多課本上不會教的經驗，但可惜我連知識都沒有，所以聽不懂。\n總而言之 修了 20 學分，最後 GPA 4.07 ，有達到我在學期初說要上 4 開頭的夢嗚嗚，系排名 22 (17.46%)。\n","permalink":"https://chaoray.github.io/posts/course-review/%E5%8F%B0%E5%A4%A7%E8%B3%87%E5%B7%A5%E5%A4%A7%E4%B8%80%E4%B8%8B%E4%BF%AE%E8%AA%B2%E5%BF%83%E5%BE%97/","summary":"\u003ch3 id=\"羽球初級\"\u003e羽球初級\u003c/h3\u003e\n\u003cdiv class=\"alert alert-important\" role=\"alert\"\u003e\n    \u003cp class=\"alert-heading\"\u003e\n      \u003cspan class=\"alert-icon\"\u003e\u003csvg class=\"octicon octicon-report mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\" fill=\"currentColor\"\u003e\u003cpath d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/span\u003e課程資訊\u003cbr\u003e\u003c/p\u003e","title":"台大資工大一下修課心得"},{"content":"計算機程式設計 課程資訊\n授課教授：黃上恩、呂學一\n實得等第：A+\n品質指數：★★★★★\n甜度指數：★★★★\n涼度指數：★\n紮實指數：★★★★★\n分數組成\n三次考試取平均\n📌 授課內容 主要是 C 語言\n然後偷渡一些 DSA 的東西\n以及 C++\n📌 教學方式 與呂學一教授合授，老師會自備PPT講解，禁止拍照錄影\n📌 上課教材 老師自製PPT\n📌 作業、考試方式 有三次段考，沒有作業，但會有每週習題。\n📌 短評、心得 如果有一些程式底子，摸過競程，相對會輕鬆很多。\n不過仍然有高達40%的期中停修率，所以也不知道對於大家是簡單還是難。\n上課的PPT都作的很精美，也會搭配範例、演示程式說明。呂學一老師講的通常比較多元與艱深，相對黃上恩老師就比較平民化一些。上課可以不去，不算出缺席也不點名，但我認為不論你是初學者還是大電神，都可以在課程中學到一些東西。\n每週會提供約10多題的、放在各大OJ上的練習題，難度由簡到繁，通常與考試相關，推薦多練習。另外，每次考試前都會有模擬考，也是與考試高度相關，建議認真把模擬考的每一題認真寫完+檢討，不知道為什麼模擬考通常都比正式考試難。\n考試分A、B、C三部份，滿分110，超過100以100計。A部份（60%）都是基礎題，給分也相對多，屬於必須拿的部份。B部份（40%）會需要你結合上課部份與通靈天份答題，通常能寫出一半就不錯了。C部份（10%）就是助教出題團隊放飛自我的區域，屬於加分題，通常超難題目也很長，不過有一些可以寫，應該算運氣加分。我這屆三次段考平均分別為：83.05、46.04、55.21，這是停修完的成績，原本更低，供參。在這裡偷偷感謝老師與教學團隊，題目很有趣，可以看出出題者的用心。\n不知道是因為今年不是邦峰，以往都沒調分。今年有呂氏調分，拉的很用力，原本C-可以拉到A-，A-可以拉到A+。作為原始成績A+者微討厭。\n總之，作為大一上第一堂程式課，大推大推大推。\n英文一 課程資訊\n授課教授：李鴻瓊\n實得等第：A+\n品質指數：★★★★\n甜度指數：★★\n涼度指數：★\n紮實指數：★★★★★\n分數組成\nClass Attendance 10%\nAdvance Reading and Active Participation 15%\nAssignments and Reports 20%\nMidterm and Final 55%\n📌 授課內容 包含以下選文/電影：\nMaxine Hong Kingston, “Tongue-Tied.”\nLi-Young Lee, “Persimmons.”\nFilm: David Fincher, The Curious Case of Benjamin Button.\nWilliam Golding, “Thinking as a Hobby.”\nFilm: Akira Kurosawa, Akira Kurosawa’s Dreams.\nWilliam Cronon, “The Trouble with Wilderness.”\nBernard Malamud, “Angel Levine.”\nEmily Dickinson, “There’s a certain Slant of light,”\nJacob Bronowski, “The Nature of Scientific Reasoning.”\n📌 教學方式 新的選文上課會讓小組間討論，討論完後上台發表。老師也會事後講解他對選文的詮釋。有一堂助教課。\n📌 上課教材 沒有PPT、沒有筆記，只有所有選文及單字融合成的一份PDF放在COOL上。\n📌 作業、考試方式 總共有兩個大作業，作業內容是要針對某篇選文寫一篇Essay（約500字），然後每個作業分三次，第一次是完全不靠外部工具寫，第二次是跟據助教給的評語修改，第三次是用AI修改然後公開給大家看\n有期中期末，考試分為選擇與手寫，選擇30%手寫70%。選擇總共15題，考10題與選文內容、詮釋相關的題目，與5題單字題。手寫是叫你組合考試範圍內所有的選文，與老師上課的詮釋，作一個統整分析，然後講出自己的見解（我很難描述），規定要寫滿台大考試紙2面半，並提到老師的詮釋。\n📌 短評、心得 想輕鬆修英文的不推，整體偏硬但給分扎實甜，我感覺一直都很忙但沒學到什麼東西。\n總共有兩次報告，報告主題是某篇選文去作延伸，要總結選文內容、說自己對選文的見解、提到選文的時代背景等等。每次報告25分鐘，報告完剩下的時間會讓台下同學問問題，台下發問會加分（算在Class Attendance、Active Participation且有紀錄），所以儘量積極發問賺分數。老師會認真聽你的報告，所以要認真準備。\n作業本身偏水，你可以選擇照著規則寫，或者全程用AI，想必都知道要選哪個。作業要繳交兩次，一次實體一次線上，線上會在上課前幾天關閉，實體則是上課開始繳交。如果線上沒交，只交實體則算遲交。\n選文通常接近意識流，沒點文學底子第一次讀很難讀懂，老師上課也不提供筆記、PPT，所以上課記得做點筆記。每次上課會簽到，以及簽你有沒有讀進階選文（Advance Reading），可以寫你讀了幾頁，但大家通常都寫全讀完。順帶一題，老師會有一張表，上面有每個學生的照片。\n考試偏難，不會考進階選文，選擇部份把選文認真看完就好，寫作部份需要你上課有認真聽老師講，提及老師的詮釋，外加許多努力才能拿很高分。另外，老師不會特別講考試範圍，需要寫信跟助教確認。\n老師很認真，很和藹。助教人很好，寫信詢問回覆很詳細，學習上有困擾也可以找助教。若想上一堂扎實的英文課可以選。\n批判思考與公共論述 課程資訊\n授課教授：鄧志松\n實得等第：A\n品質指數：★★★\n甜度指數：★★★★★\n涼度指數：★★★★★\n紮實指數：★★★★★\n分數組成\n黑箱，如果很在意不推。\n但是會點名，而且是看心情點名、點到缺席看心情打缺席、點到沒缺席看心情加分。\n📌 授課內容 Week 1 課程介紹: 如何思考\nWeek 2 論證：以理服人\nWeek 3 創意：搞大思考的視野\nWeek 4 科學與理性\nWeek 5 主觀與客觀\nWeek 6 意識型態的世界\nWeek 7 普世價值與人權\nWeek 7 民主政治的迷思\nWeek 8 衝突管理\nWeek 9 兩岸關係將何去何從\nWeek 10 戰後國際秩序與國際政治\nWeek 11 國際經濟的運作邏輯\nWeek 12 中國崛起與中美爭霸\nWeek 13 公共政策與價值平衡\nWeek 14 法治與憲政危機\n📌 教學方式 老師會針對某議題講解，並穿插問題討論\n📌 上課教材 自製心智圖＋英文影片\n📌 作業、考試方式 每週會有作業，通常是回答某某問題、討論某某議題，然後評論同學意見至少五篇，以及選一則影片發表心得\n約500字即可，時限未知，下週上課做也行，老師通常只會回覆第一個交作業的人的內容\n此外沒有考試，只有期末報告\n📌 短評、心得 小推，整體很涼5分甜，上課不愛發言、性格內向者不推\n成績黑箱這點我不是很喜歡\n會紀錄誰沒寫作業，上課會提醒要記得寫作業\n如果想拿很高分需要積極跟老師對話，讓他記住你，不過討論的議題還算有趣\n有分組，但只是為了討論而分組，在此建議慎選組員，很多人會退選\n老師不知道為什麼很強調「跟AI討論」這件事情，他說要與AI來回對話才能整理思緒得出結論\n期末報告是個人報告，需要你做一個心智圖，引述老師的公告：\n「期末報告要拿高分，關鍵不在資料多，而在觀點清楚。須先明確提出個人論點，並以嚴謹邏輯與例證加以論證，同時預設反對意見並回應，展現思辨能力。最後需清楚標註資料來源，避免流於拼湊，才能與他人區隔、提升評價。」\n報告截止日期是在期末周之後，這點很讚\n總之是一堂可以腦袋空空去腦袋空空回來的課\n跨領域統計數據分析入門 課程資訊\n授課教授：陳彥賓\n實得等第：A\n品質指數：★★★★★\n甜度指數：★★★\n涼度指數：★★★★★\n紮實指數：★★\n分數組成\n上課互動10%\n上課練習40%\n期末報告50%\n📌 授課內容 高中學過的統計方法、P-Value、ANOVA分析\n📌 教學方式 中文授課，與其他老師合授，有TSMC來演講\n📌 上課教材 老師自編PPT\n📌 作業、考試方式 沒有考試，只有期末報告\n作業是上課練習，助教會帶著做，有問題可以隨時問\n📌 短評、心得 大推，整體很涼但給分小小甜。\n作業基本都是Excel操作那類的，如果本身會一點點Excel那可以在10分鐘內做完，不過要小心有沒有做錯，不然扣分很重。\n上課互動老師說從6分開始往上打，每次報告或與台上老師互動者可以加1分。不點名不算出席率。\n時不時會有其他老師來上課，但都偏涼，不過很有趣。\n期末報告就是隨便挑個主題，用上課教的分析方法分析並能講出自己見解就好，外加製作海報。我自認很混但還是拿了40分。\n最後會有工作坊，老師會挑幾組去工作坊報告，其實只是把期末報告的東西講給台下企業參訪者聽，中場休息有餐點吃。\n老師人很好很和善，上課也很認真教，認真聽能學到不少東西。不論想要輕鬆學習一些些分析方法，或者只是想修水課都很推。\n","permalink":"https://chaoray.github.io/posts/course-review/%E5%8F%B0%E5%A4%A7%E8%B3%87%E5%B7%A5%E5%A4%A7%E4%B8%80%E4%B8%8A%E4%BF%AE%E8%AA%B2%E5%BF%83%E5%BE%97/","summary":"\u003ch2 id=\"計算機程式設計\"\u003e計算機程式設計\u003c/h2\u003e\n\u003cdiv class=\"alert alert-important\" role=\"alert\"\u003e\n    \u003cp class=\"alert-heading\"\u003e\n      \u003cspan class=\"alert-icon\"\u003e\u003csvg class=\"octicon octicon-report mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\" fill=\"currentColor\"\u003e\u003cpath d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/span\u003e課程資訊\u003cbr\u003e\u003c/p\u003e","title":"台大資工大一上修課心得"},{"content":"又稱模倒數、模逆元，簡稱$MMI$或$inv$\n如果$a$跟$n$互質\n那一定有一個$b$，讓$(a \\times b) \\mod n = 1$\n或$(a \\times b - 1)$可以整除$n$\n這時候$b$就是$a \\mod n$的模反元素\n而且$b + kn, k \\in Z$\n$b + kn$都是$a \\mod n$的模反元素\n用途 在求$a \\div b \\mod p$時，如果$a$、$b$太大無法直接相除\n需要把$\\div b$替換成$\\times c$，並使$a \\div b \\equiv a \\times c \\pmod p$\n這樣就可以拆成$(a \\mod p) \\times (c \\mod p)$\n而這個$c$就是模反元素\n處理溢位時尤為好用\n舉例 $3$、$11$互質\n$inv = 4$\n$3 \\times 4 \\mod 11 = 1$\n所以根據定義：\n$4 + 11k = 4, 15, 26 ...$\n$3 \\times 15 \\mod 11 = 1$\n$3 \\times 26 \\mod 11 = 1$\n$...$\n$3 \\times (4 + 11k) \\mod 11 = 1, k \\in Z$\n那怎麼知道$b$，或者說是$inv$?\n怎麼找模反元素 #define MOD 1000000007 ll inv(ll a) { return qpow(a, MOD - 2); } inv(n); // 即為模反元素 $MOD$必須為質數\n舉例：\n#define MOD 11 int main() { cout \u0026lt;\u0026lt; inv(3, MOD); // 4 } why? 首先根據貝祖等式，可以用擴展歐幾里得算法找到整數$x$、$y$符合：\n$ax + by = gcd(a, b)$\n貝祖定理中有說：\n如果整數$a$、$b$互質，那$ax + by = 1$的$x$、$y$有整數解\n我們知道$MOD$(以下為$M$)是質數，所以\n$gcd(a, M) = 1$\n$ax + My = gcd(a, M) = 1$\n此時$x$、$y$必定有整數解\n整個算式取模\n$(ax + My) \\mod M = (1) \\mod M$\n$ax \\mod M = 1$\n那$x$就是我們要找的模反元素\n根據費馬小定理 如果$a$是一個整數，$p$是一個質數\n那$a^p \\equiv a \\pmod p$\n而且$a^{p-1} \\equiv 1 \\pmod p$\n整個同乘$a^{-1}$，所以$a^{p-2} \\equiv a^{-1} \\pmod p$\n反過來看$a^{-1} \\equiv a^{p-2} \\pmod p$\n然後 套到之前的質數$M$中：\n$a^{-1} \\equiv a^{M-2} \\pmod M$\n同等於：\n$a^{-1} \\mod M = a^{M-2} \\mod M$\n上面說過：\n$ax \\mod M = 1$\n所以同除以 $a$ 後：\n$x \\mod M = \\frac{1}{a} = a^{-1}$\n且$a^{-1} \\mod M = a^{M-2} \\mod M$\n所以$x = a^{M-2} \\mod M$\n","permalink":"https://chaoray.github.io/posts/notes/%E6%A8%A1%E5%8F%8D%E5%85%83%E7%B4%A0/","summary":"\u003cp\u003e又稱\u003cstrong\u003e模倒數\u003c/strong\u003e、\u003cstrong\u003e模逆元\u003c/strong\u003e，簡稱$MMI$或$inv$\u003c/p\u003e\n\u003cp\u003e如果$a$跟$n$互質\u003c/p\u003e\n\u003cp\u003e那一定有一個$b$，讓$(a \\times b) \\mod n = 1$\u003cbr\u003e\n或$(a \\times b - 1)$可以整除$n$\u003c/p\u003e\n\u003cp\u003e這時候$b$就是$a \\mod n$的模反元素\u003c/p\u003e\n\u003cp\u003e而且$b + kn, k \\in Z$\u003cbr\u003e\n$b + kn$都是$a \\mod n$的模反元素\u003c/p\u003e\n\u003ch2 id=\"用途\"\u003e用途\u003c/h2\u003e\n\u003cp\u003e在求$a \\div b \\mod p$時，如果$a$、$b$太大無法直接相除\u003c/p\u003e\n\u003cp\u003e需要把$\\div b$替換成$\\times c$，並使$a \\div b \\equiv a \\times c \\pmod p$\u003c/p\u003e\n\u003cp\u003e這樣就可以拆成$(a \\mod p) \\times (c \\mod p)$\u003cbr\u003e\n而這個$c$就是模反元素\u003c/p\u003e\n\u003cp\u003e處理溢位時尤為好用\u003c/p\u003e\n\u003ch2 id=\"舉例\"\u003e舉例\u003c/h2\u003e\n\u003cp\u003e$3$、$11$互質\u003cbr\u003e\n$inv = 4$\u003cbr\u003e\n$3 \\times 4 \\mod 11 = 1$\u003c/p\u003e\n\u003cp\u003e所以根據定義：\u003cbr\u003e\n$4 + 11k = 4, 15, 26 ...$\u003cbr\u003e\n$3 \\times 15 \\mod 11 = 1$\u003cbr\u003e\n$3 \\times 26 \\mod 11 = 1$\u003cbr\u003e\n$...$\u003cbr\u003e\n$3 \\times (4 + 11k) \\mod 11 = 1, k \\in Z$\u003c/p\u003e","title":"模反元素"},{"content":"關於我 本名趙文睿，目前大二，就讀於台大資訊工程學系。\n沒什麼夢想也不知道自己要幹嘛的普通人。\n關於這個網站 採用 Hugo + PaperMod 以及自己魔改出來的。\n大概很難更新的很勤，主要是不如其他成熟的部落格網站方便，自己久久看一次會覺得好醜想改掉。\n","permalink":"https://chaoray.github.io/about/","summary":"about","title":"About"}]