puzzle 板


LINE

寫一下我解這題的心路歷程好了 XD 引文後有雷 ※ 引述《babufong (嗶嗶)》之銘言: : 361. Subsequence of Thue - Morse sequence : http://projecteuler.net/problem=361 : Thue - Morse sequence {Tn} 是一個二進位制的數列,他符合以下條件: : T0 = 0 : T2n = Tn : T2n+1 = 1 - Tn : 我們可以知道 {Tn} 的前幾項是這樣的: : 01101001100101101001011001101001.... : 定義 {An} 是一個整數數列,而他的每一項用二進位制表示都有出現在 {Tn} 之中 : 舉例來說,十進位制的 18 用二進位制表示就是 10010 : 10010 出現在 T8 到 T12 之間,所以 18 是 {An} 的其中一項 : 14 用二進位制表示為 1110,而 1110 從未出現在 {Tn} 中,故 14 不是 {An} 其中一項 : An 的前幾項我們也知道了,如下: : n 0 1 2 3 4 5 6 7 8 9 10 11 12 ... : An 0 1 2 3 4 5 6 9 10 11 12 13 18 ... : 我們還能證明出 A100 = 3251 而 A1000 = 80852364498 : 18 : 請計算出 Σ A10^k 的末九位 : k=1 一開始我是用了另一個等價的 T_n 的定義在做: 從"0"開始 把目前有的字串 0 1 反轉之後接到後面 無限接下去就是 T_n 於是在想到底什麼型式是不會出現的 很容易找到了 111 000 11011 00100 但發現 1101011 0010100 這種也要時我果斷放棄 後來回到原來的定義才發現原來直接用"延伸"的方式去找就好 例如 10010 這一串 表示前面必然有個地方有 10010 => 100 這個字串在 用類似的道理就可以知道 所有夠長的字串都能夠由某個較短的字串做以下四個動作之一得到: (1) 做 1 -> 10, 0 -> 01 (2) 做 1 -> 10, 0 -> 01 但去尾 (3) 做 1 -> 01, 0 -> 10 但截頭 (4) 做 1 -> 01, 0 -> 10 但截頭去尾 例如 100 做 (1) 得到 100101 做 (2) 得到 10010 做 (3) 得到 11010 做 (4) 得到 1101 仔細比較得到的這四個數 會發現永遠有 (4) < (2) < (3) < (1) < 長一點字串的 (4) 因此 我們會得到結論 長度 4 的字串前半段是長度 2 做 (1) 後半段是長度 3 做 (4) 長度 5 的字串前半段是長度 3 做 (2) 後半段是長度 3 做 (3) 長度 6 的字串前半段是長度 3 做 (1) 後半段是長度 4 做 (4) 依此類推 這樣一來 長度 n 的字串的個數 S(n) 就是如下的數列 1 2 3 5 6 8 10 11 12 14 16 18 20 21 22 23 24 ... (這就是我在前篇推文提到的數列) 它的遞迴關係是 S(2n) = S(n)+S(n+1) n≧2 S(2n+1) = 2S(n+1) n≧2 S(1) = 1, S(2) = 2, S(3) = 3 那麼根據上面得到的這個規則 A_n 就只要去求 S(n) 的前幾項和到正好超過 再去計算它是那個長度的哪個位置 是前半還是後半 是由長度多少字串的第幾個延伸來的 就可以知道它是什麼字串 結果 A_{10^15} 因為用 Mathematica 直接生字串生到記憶體炸掉了...XD 這中間為了節省時間我做了非常多數學計算 甚至把上面這數列的前 N 項和寫了一個公式出來 (由於這數列等於 1.5n-1.5 加上一個很有規律升降的數列 前 N 項和可以由 Σ(1.5n-1.5) 再去調整 這樣就有公式了) 但無論如何總是快不起來 就算記憶體不炸掉要算出 A_{10^18} 也要半小時 回頭看到題目發現範例特別把 18 (10010) 出現在 T_8 ~ T_12 給說出來 這才打醒我不必要去記整個字串 去記它在字串的哪裡就好了... 而根據給定的 T_n 的定義 這個延伸的動作就變得像是乘以 2 一樣簡單 不過要從在哪裡的字串去求出那一位是什麼也讓我想了一會兒 然後我才想起一件很重要的事: T_n 其實還有另一個等價定義 T_n = {1, 若 n 的二進位表示法中 1 的個數為奇數 {0, 若 n 的二進位表示法中 1 的個數為偶數 也就是俗稱(?)的 Parity 利用這一點 給定範圍之後我能夠一位一位算過去求餘數 發現這一點之後我改用 C 寫 求 Parity 的部份我特別寫了一支小小的組合語言副程式嵌進去 利用了組合語言裡會根據結果的 Parity 設定旗標的功能直接讀出我要的 Parity (這個副程式組譯之後只有 20 byte 算是滿自豪的 XD 所以就直接寫成字串後當成函式來呼叫了) 不過跑出來的結果還是不對 (這個時候 A_{10^18} 只要約一分鐘就能有結果) 一直到 utomaya 的推文 (A_{10^18} 約是 11 億位二進位) 之後我回頭檢查算式 才發現原來是計算上面那數列的前 N 項和的公式的中間結果溢位了... 把這個溢位改掉之後才終於得到正確答案 orz 總計從我開始解這題的星期日開始 邊忙要交的作業邊解 然後還跨過了這週四某科的期中考 一直到現在下一題快出來了才把這題幹掉...orz -- 來去把 360 也幹掉拿最新五題的成就 @_@ -- LPH [acronym] = Let Program Heal us -- New Uncyclopedian Dictionary, Minmei Publishing Co. --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.28.91
1F:推 babufong:推 12/10 10:41







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP