11472: Beautiful Numbers

13
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

description

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

Transcript of 11472: Beautiful Numbers

Page 1: 11472: Beautiful Numbers

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 。

Page 2: 11472: Beautiful Numbers

2

題意範例:N=2 , M=5Beautiful Number 一共有以下 4 種10,101,1010,10101Output 4

N=3 , M=5Beautiful Number 一共有以下 9 種210,1012,1210,2101,10121,12101,21010,21012,21210Output 9

Page 3: 11472: Beautiful Numbers

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 … 等

Page 4: 11472: Beautiful Numbers

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

如何計算上面那幾格的答案 ?

Page 5: 11472: Beautiful Numbers

5

解法:從個位數開始向後補位,規則為補上的數要與前一位相差 1所以以下這些數都可能在補上一些尾數之後形成 beautiful numbers且 * 只有 * 以下這些數才能以上述的補位規則形成 beautiful numbers

長度 1 2 3 4 51 10 101 1010 10101 BN[0111][5][1]=2

12 121 1012@ 10121@2 21 123 1210@ 10123

23 210@ 1212 12101@3 32 212 1232 12121

34 232 1234 12123 BN[1110][5][3]=24 43 234 2101@ 12321

45 321 2121 123235 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)

Page 6: 11472: Beautiful Numbers

6

解法範例:由於要從個位數開始向後補位,所以初始條件則令所有表示個位數 (0 除外 ) 的陣列值為 1BN[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;

Page 7: 11472: Beautiful Numbers

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 的 Numbers21→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];

Page 8: 11472: Beautiful Numbers

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

Page 9: 11472: Beautiful Numbers

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 連續三個 100 0000 0001 00 0000 0011 00 0000 011100 0000 0010 00 0000 0110 00 0000 111000 0000 0100 00 0000 1100 00 0001 110000 0000 1000 00 0001 1000 00 0011 100000 0001 0000 00 0011 0000 00 0111 0000… … …10 0000 0000 11 0000 0000 11 1000 0000 … 等

Page 10: 11472: Beautiful Numbers

10

解法範例:利用一陣列 b[55] 依序存放上頁中所有的 x 值,計算方法如下:

連續一個 1 ,從 b[0]~b[9] 共十個 // i = 1~9b[0] = 1; //00 0000 0001b[i] = b[i-1]*2;

連續兩個 1 ,從 b[10]~b[18] 共九個 // i = 11~18b[10] = 3; //00 0000 0011b[i] = b[i-1]*2;

連續三個 1 ,從 b[19]~b[26] 共八個 // i = 20~26b[19] = 3; //00 0000 0111b[i] = b[i-1]*2;

以此類推直到連續十個 1 ,一共 55 個數

Page 11: 11472: Beautiful Numbers

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 的所有數值之總和

Page 12: 11472: Beautiful Numbers

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

Page 13: 11472: Beautiful Numbers

13

討論:時間複雜度:需要花費最多時間的地方為填滿 BN[ b[x] ][y][z]

O(x*y*z) , x = 0 ~ 54 、 y = 1~100 、 z = 0~9