description
a國有n個城市,編號為1到n,任意兩個城市之間有一條路。shlw閒得沒事幹想周遊a國,及從城市1出發,經過且僅經過除城市1外的每個城市1次(城市1兩次),最後回到城市1。由於shlw很傻,他只願意走一定長度,多了少了都不幹,現在他想知道一共有多少種方案可供選擇。
input
第一行為兩個整數n,l,分別為城市數和路程總長。
之後n行,每行n個整數,其中第i行第j列為ai,j,滿足ai,i=0;ai,j=aj,i。
output
輸出共1行,為總方案數。
sample input
3 60 1 3
1 0 2
3 2 0
sample output
2
data constraint
對於30%,1<=n<=10
對於另外30%,1<=n<=14,1<=l<=30
對於100%,1<=n<=14,1<=ai,j<=100,000,000,1<=l<=2,000,000,000
悄悄告訴你:資料的答案都很大,反正直接輸0是沒分的,但都在int範圍內。
為了降低題目難度,ai,j的種類數不會太多
1 #include 2 #include 3 #include 4#define mo 19260817
5#define ll long long
6#define n 15
7using
namespace
std;
8int
n,m,l,a[n][n],f[mo],ans,i;
9ll g[mo];
10 ll calc(int x,int y,int k)
11int gethash(int x,int y,int
k)12
17void dfs1(int d,int x,int y,int
k)18
25for (int i=1;iif (!(y>>i&1)) dfs1(d+1,i,y|1
27void dfs2(int d,int x,int y,int
k)28
35for (int i=1;iif (!(y>>i&1)) dfs2(d+1,i,y|1
37int
main()
38
折半搜尋 meet in the middle
在使用搜尋的時候,當n過大2n會超時,這時候可以用折半搜尋,把時間複雜度降低到2n 2 1 具體方法 分別搜尋前一半,把狀態放入a陣列,搜尋後一半,把狀態放入b陣列,最後統計答案。一般meet in the middle的難點主要在於最後答案的組合統計。我們可以現將a或b陣列sort,讓其有序。然後...
poj 折半搜尋
題意 給你乙個含有n n 1000 個數的數列,問這個數列中是否存在四個不同的數a,b,c,d,使a b c d 若存在則輸出最大的d 思路 完全暴力的話o n 4 會t,可以考慮雙向搜尋,公式變形為a b d c 分別列舉a b和c d,將值和下標存在結構體中,再二分查詢即可 include in...
折半搜尋 某種密碼
某種密碼 描述關於某種密碼有如下描述 某種密碼的原文a是由n個數字組成,而密文b是乙個長度為n的01數串,原文和密文的關聯在於乙個鑰匙碼key。若key ai bi key ai bi 則密文就是原文的一組合法密碼。現在有原文和鑰匙碼,請編乙個程式來幫助他統計到底有多少個符合條件的密文。輸入第一行兩...