Description
Ignatius花了一個星期的時間終於找到了傳說中的寶藏,寶藏被放在一個房間裡,房間的門用密碼鎖起來了,在門旁邊的牆上有一些關於密碼的提示信息:Input
輸入數據的第一行是一個整數T(1<=T<=300),表示測試數據的數量.每組測試數據的第一行是兩個整數N(0<=N<=5000)和C(2<=C<=16),其中N表示的是題目描述中的給定十進制整數,C是密碼的進制數.測試數據的第二行是一個整數M(1<=M<=16),它表示構成密碼的數字的數量,然後是M個數字用來表示構成密碼的數字.兩個測試數據之間會有一個空行隔開.Output
對於每組測試數據,如果存在要求的密碼,則輸出該密碼,如果密碼不存在,則輸出"give me the bomb please".Sample Input
3 22 10 3 7 0 1 2 10 1 1 25 16 3 A B C
Sample Output
110 give me the bomb please CCB
題意及分析:
給一個10進制數n,m個c進制數。用m個數中的一些數組成n最小的倍數。
這裡用到了這樣的知識點:
此題可以用同余判斷的方法來剪枝。
假如 A%X == B%X (設A
那麼 (A*10+Ki)%X==(B*10+Ki)%X
所以A,B之中我們只要取前面的A就行,因為題目要取最小的數,通過同余我們可以知道,A和B這兩個數在末尾添加任何相同的數MOD X之後的余數都是一樣的,因此對於比A大的數我們就沒有必要去擴展了。B可以直接減掉。即對余數進行標記,已經出現過的余數(即當前得到的數與我之前已經得到的某個數同余),將不再擴展節點。
這是截取自別人的博客:http://blog.csdn.net/lenleaves/article/details/8908416
大致意思是,如果一個小一點的數A,mod X的值,等於一個大一點的數B,mod X的值,在考慮了A拓展的情況後,就不需要考慮B的拓展情況了,因為按照k*c+h這樣的拓展方法,A和B得到的是相同的余數。所以就把出現過的余數標記。
講m個數從小到大排序,依次拓展新的數,這樣就可以得到最小的滿足條件的n的倍數。也可以看看上面博客的解釋。那是相似的一道題。
AC代碼: