problem description
ignatius花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在門旁邊的牆上有一些關於密碼的提示資訊:
密碼是乙個c進製的數,並且只能由給定的m個數字構成,同時密碼是乙個給定十進位制整數n(0<=n<=5000)的正整數倍(如果存在多個滿足條件的數,那麼最小的那個就是密碼),如果這樣的密碼存在,那麼當你輸入它以後門將開啟,如果不存在這樣的密碼......那就把門炸了吧.
注意:由於寶藏的歷史久遠,當時的系統最多只能儲存500位密碼.因此如果得到的密碼長度大於500也不能用來開啟房門,這種情況也被認為密碼不存在.
input
輸入資料的第一行是乙個整數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.我保證輸入資料都是合法的.
output
對於每組測試資料,如果存在要求的密碼,則輸出該密碼,如果密碼不存在,則輸出"give me the bomb please".
注意:構成密碼的數字不一定全部都要用上;密碼有可能非常長,不要試圖用乙個整型變數來儲存密碼;我保證密碼最高位不為0(除非密碼本身就是0).
sample input
322 10
37 0 1
2 1011
25 16
3a b c
sample output
110give me the bomb please
ccb hint
hint
huge input, scanf is recommended.
思路還是很簡單,就是一位一位的搜(從小到大的搜),然後利用餘數進行去重,因為可以根據餘數進行劃分成群,具有相同的餘數的數的性質都是一樣,在後面新增某個(某幾個)數字後就能整除n,這裡面還有乙個判斷能否整除的技巧。
#include
#include
#include
#include
usingnamespace
std;
bool flag[17],vis[5005];
int c,n;
structnode
;node ans;
int check(node &a) //
判斷能否整除
bool bfs()
else }
}}while (!q.empty())
r=check(t);
if(!vis[r])
else }
t.len--;}}
}return false; }
int main()
if(n==0)
if (bfs())
printf("\n");
}else
printf
("give me the bomb please\n");
}return0;}
hdu1226 超級密碼 bfs
思路 因為n 5000 所以方案個數也只有5000個,可以用bfs來做。一開始挺糾結怎麼做,但是上網一看別的大牛的 一下子就恍然大悟豁然開朗,如同撥開雲霧見青天 o include include include include using namespace std const int maxn ...
HDU1226 超級密碼 BFS
由於n最大也只有5000,則對於列舉的密碼s,s n的狀態也只有5000種。所以每乙個列舉到的狀態,開兩個內容,乙個表示密碼的字串,乙個表示模n的餘數,當餘數為0的時候,說明找到密碼。include include include include include using namespace st...
hdu 1226 超級密碼 bfs
c 超級密碼 time limit 10000msmemory limit 32768kb64bit io format i64d i64u submit status description ignatius花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在...