1 / 13

11472: Beautiful Numbers

11472: Beautiful Numbers. ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 1 1472: Beautiful Numbers 解題者: 邱經達 解題日期: 20 11 年 5 月 5 日 題意: 若一個 N 進位的數用到該 base 裡全部的數字,且任兩個數字之間的差值都剛好是 1 且首位數字不為 0 ,則該數字為 Beautiful Number 。

Download Presentation

11472: Beautiful Numbers

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 11472: Beautiful Numbers • ★★★★☆ • 題組:Problem Set Archive with Online Judge • 題號:11472: Beautiful Numbers • 解題者:邱經達 • 解題日期:2011年5月5日 • 題意: 若一個N進位的數用到該base裡全部的數字,且任兩個數字之間的差值都剛好是1且首位數字不為0,則該數字為Beautiful Number。 給定兩數N、 M,分別代表N-base及M位數字,求出在N-base中的數字從長度1到長度M總共出現多少個Beautiful Numbers。 2<=N<=10,1<=M<=100。

  2. 題意範例: N=2,M=5 Beautiful Number一共有以下4種 10,101,1010,10101 Output  4 N=3,M=5 Beautiful Number一共有以下9種 210, 1012,1210,2101, 10121,12101,21010,21012,21210 Output  9

  3. 解法:Dynamic Programming + Bitmask 使用一3維陣列紀錄每個Number的狀態及個數 BN[used_digit][length][last_digit] use_digit: 這個Number有用到的數字(以二進位表示) length: 該Number的位元長度 last_digit: 該Number的最後一位數字 例: BN[00 0000 1110][6][2] 可代表 123212、321212、121232 …等

  4. 解法: 若輸入N=5 M=10 則答案應該會存在以下幾格 BN[00 0001 1111][length][0] BN[00 0001 1111][length][1] BN[00 0001 1111][length][2] ... BN[00 0001 1111][length][9] 其中length = 1~M ↑從第1位開始連續五個1 也就是都使用了01234五個數字,長度為length而最後一位數字分別從0~9 如何計算上面那幾格的答案?

  5. 解法: 從個位數開始向後補位,規則為補上的數要與前一位相差1 所以以下這些數都可能在補上一些尾數之後形成beautiful numbers 且*只有*以下這些數才能以上述的補位規則形成beautiful numbers 長度 1 2 3 4 5 110 101 1010 10101 BN[0111][5][1]=2 12 121 1012@ 10121@ 221 123 1210@ 10123 23 210@1212 12101@ 332 212 1232 12121 34 232 1234 12123 BN[1110][5][3]=2 443 234 2101@12321 45 321 2121 12323 5 54 323 2123 12343 … 56 343 2321 12345 … 345 2323 21010@ BN[0111][5][0]=2 … 2343 21012@ … 21210@ BN[0111][5][2]=1 … (@為base-3的beautiful numbers)

  6. 解法範例: 由於要從個位數開始向後補位,所以初始條件則令所有表示個位數(0除外)的陣列值為1 BN[used_digit][length][last_digit] BN[00 0000 0010][1][1] = 1; BN[00 0000 0100][1][2] = 1; BN[00 0000 1000][1][3] = 1; ... ... BN[10 0000 0000][1][9] = 1;

  7. 解法範例: 則我們可以從上列中的個位數產生長度為2的Numbers,以個位數字2為例: 2→21 (補1) 2→23 (補3) 對以上的動作而言程式應該執行以下的動作 BN[00 0000 0110][2][1] += BN[00 0000 0100][1][2]; BN[00 0000 1100][2][3] += BN[00 0000 0100][1][2]; 再用長度為2的Numbers產生長度為3的Numbers 21→210 (補0) 21→212 (補2) 對以上的動作而言程式應該執行以下的動作 BN[00 0000 0111][3][0] += BN[00 0000 0110][2][1]; BN[00 0000 1100][3][2] += BN[00 0000 0110][2][1];

  8. 解法範例: 從上列的範例可以觀察出DP function為 if (ld-1>=0): BN[ used_bits | bit(ld-1) ][len+1][ld-1] += BN[used_bits][len][ld]; if (ld+1<10): BN[ used_bits | bit(ld+1) ][len+1][ld+1] += BN[used_bits][len][ld]; 例:bit(3) = 00 0000 1000

  9. 解法範例: 用三層迴圈填完上頁的全部BN[x][y][z]陣列表格, x最外層而z最內層,y = 1~100、z = 0~9 其中x不需要從00 0000 0000~11 1111 1111每個值(1024個)都跑一遍。 從Page.5中的表可以知道,只有used_bit表示成n個1相鄰的數才有可能向後補位形成Beautiful Numbers,也就是若x代表的used_bits不為以下這些數值,BN值必為0,毋需處理 連續一個1 連續兩個1 連續三個1 00 0000 0001 00 0000 0011 00 0000 0111 00 0000 0010 00 0000 0110 00 0000 1110 00 0000 0100 00 0000 1100 00 0001 1100 00 0000 1000 00 0001 1000 00 0011 1000 00 0001 0000 00 0011 0000 00 0111 0000 … … … 10 0000 0000 11 0000 0000 11 1000 0000 …等

  10. 解法範例: 利用一陣列b[55]依序存放上頁中所有的x值,計算方法如下: 連續一個1,從b[0]~b[9]共十個 // i = 1~9 b[0] = 1; //00 0000 0001 b[i] = b[i-1]*2; 連續兩個1,從b[10]~b[18]共九個 // i = 11~18 b[10] = 3; //00 0000 0011 b[i] = b[i-1]*2; 連續三個1,從b[19]~b[26]共八個 // i = 20~26 b[19] = 3; //00 0000 0111 b[i] = b[i-1]*2; 以此類推直到連續十個1,一共55個數

  11. 解法範例: 因此填表可以改寫成BN[ b[x] ][y][z], 其中x = 0 ~ 54、y = 1~100、z = 0~9 最後對輸入N、M,問題的答案為: BN[ Beautiful_Numbers_bit[N] ][m][ld]陣列中 m = 2 ~ M、ld = 0 ~ 9 的所有數值之總和

  12. 解法範例: 其中Beautiful_Numbers_bit[N]為 N=2 → 00 0000 0011 N=3 → 00 0000 0111 N=4 → 00 0000 1111 N=5 → 00 0001 1111 N=6 → 00 0011 1111 N=7 → 00 0111 1111 N=8 → 00 1111 1111 N=9 → 01 1111 1111 N=10 → 11 1111 1111

  13. 討論: 時間複雜度: 需要花費最多時間的地方為填滿BN[ b[x] ][y][z] O(x*y*z),x = 0 ~ 54、y = 1~100、z = 0~9

More Related