超級密碼 HDU 1226

2021-08-25 22:42:43 字數 1507 閱讀 1842

ignatius花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在門旁邊的牆上有一些關於密碼的提示資訊:

密碼是乙個c進製的數,並且只能由給定的m個數字構成,同時密碼是乙個給定十進位制整數n(0<=n<=5000)的正整數倍(如果存在多個滿足條件的數,那麼最小的那個就是密碼),如果這樣的密碼存在,那麼當你輸入它以後門將開啟,如果不存在這樣的密碼......那就把門炸了吧.

注意:由於寶藏的歷史久遠,當時的系統最多只能儲存500位密碼.因此如果得到的密碼長度大於500也不能用來開啟房門,這種情況也被認為密碼不存在.

輸入資料的第一行是乙個整數t(1<=t<=300),表示測試資料的數量.每組測試資料的第一行是兩個整數n(0<=n<=5000)和c(2<=c<=16),其中n表示的是題目描述中的給定十進位制整數,c是密碼的進製數.測試資料的第二行是乙個整數m(1<=m<=16),它表示構成密碼的數字的數量,然後是m個數字用來表示構成密碼的數字.兩個測試資料之間會有乙個空行隔開.

注意:在給出的m個數字中,如果存在超過10的數,我們約定用a來表示10,b來表示11,c來表示12,d來表示13,e來表示14,f來表示15.我保證輸入資料都是合法的.

對於每組測試資料,如果存在要求的密碼,則輸出該密碼,如果密碼不存在,則輸出"give me the bomb please".

注意:構成密碼的數字不一定全部都要用上;密碼有可能非常長,不要試圖用乙個整型變數來儲存密碼;我保證密碼最高位不為0(除非密碼本身就是0).

3

22 10

37 0 1

2 1011

25 16

3a b c

110

give me the bomb please

ccb

huge input, scanf is recommended.

hint
門的密碼是由幾個某進製的數構成。密碼位數小於等於500。求這個密碼最小的值。

用bfs嘗試所有數,嘗試構建的時候每個餘數最多出現一次進行大量的剪枝。

這道題給的可選數是c進製的數,那麼每次我們都要對原數乘c再加這個數。

#include#include#include#include#includeusing namespace std;

int t,w;

int c,m,n;

int kk[20],book[10010];

struct node

;void bfs()

while(!q.empty())

r.x=sum;

q.push(r);}}

printf("give me the bomb please\n");

}int main()

}m=j;

sort(kk,kk+m);

if(n==0)

memset(book,0,sizeof(book));

bfs();

}return 0;

}

hdu 1226 超級密碼

題意 給出n,c,m,密碼必須是n這個十進位制數的整數倍,c代表這個密碼是c進製數,m代表這個密碼只有m種字元構成,而且密碼不能長於500 include include include include include include include include include include ...

HDU1226 超級密碼

include include include include includeusing namespace std define maxn 555 define maxm 5555 先解釋下,這個是用bfs廣度搜尋是否成立,不斷讓那些數字打入陣列num,看是否成立 大數模運算,只要成立就輸出退出,...

hdu1226 超級密碼 bfs

思路 因為n 5000 所以方案個數也只有5000個,可以用bfs來做。一開始挺糾結怎麼做,但是上網一看別的大牛的 一下子就恍然大悟豁然開朗,如同撥開雲霧見青天 o include include include include using namespace std const int maxn ...