小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為1..n。m條道路連線在這些城市之間,每條道路將兩個城市連線起來,使得兩地的居民可以方便地來往。一對城市之間可能存在多條道路。
據史料記載,這個文明的交通網路滿足兩個奇怪的特徵。首先,這個文明崇拜數字k,所以對於任何一條道路,設它連線的兩個城市分別為u和v,則必定滿足1 <=|u - v| <= k。此外,任何乙個城市都與恰好偶數條道路相連(0也被認為是偶數)。不過,由於時間過於久遠,具體的交通網路我們已經無法得知了。小宇很好奇這n個城市之間究竟有多少種可能的連線方法,於是她向你求助。
方法數可能很大,你只需要輸出方法數模1000000007後的結果。
輸入共一行,為3個整數n,m,k。
輸出1個整數,表示方案數模1000000007後的結果。
提示
100%的資料滿足1<= n <= 30, 0 <= m <= 30, 1 <= k <= 8.
【題目說明】
兩種可能的連線方法不同當且僅當存在一對城市,它們間的道路數在兩種方法中不同。
在交通網路中,有可能存在兩個城市無法互相到達。
【輸入樣例1】3 4 1【輸入樣例2】4 3 3
【輸出樣例1】3【輸出樣例2】4【題解】
看到小資料居然也沒往狀壓上想,只是想打個表騙分,試試打表的可行性。然後寫了個dfs,放一邊打表,不過表打得不夠成功只搜出來1300+個結果,大概我在dfs裡搜尋的順序還可以再好一些,人生第一次打表以25分圓滿結束~
這道題主要的限制是邊的兩端只能相差k,以及點的度必須為偶數。對於前者,採用回連的策略避免重複。對於後者,k只有8,將i-k到i的度的奇偶性壓成1維。設f[i][j][k][l]表示考慮到點i,用了j條邊,i-k到i的奇偶性為k,當前處理i-k+l和i之間的連邊。
如果這條邊不連,可以轉移到f[i][j][k][l+1].
如果這條邊連,可以轉移到f[i][j+1][k^(1<=1)
如果l=k並且i-k的度為偶數,可以轉移到f[i+1][j][k>>1][0];
最後答案就是f[n+1][m][0][0];
模運算常數極大,適當減少模運算也是卡常的好辦法。
1 #include2 #include3roadusing
namespace
std;
4const
int mod=1000000007;5
int n,m,p,temp,f[35][35][(1
<<9)+5][9];6
intmain()722
if((!(k&1))&&f[i][j][k][p])
23 f[i+1][j][k>>1][0]=f[i][j][k][p]%mod;24}
25 printf("
%d",f[n+1][m][0][0
]);26
return0;
27 }
Jxoi2012 奇怪的道路
description 小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例 外。考古學家已經知道,這個文明在全盛時期有n 座城市,編號為1.n。m 條道路連線在 這些城市之間,每條道路將兩個城市連線起來,使得兩地的居民可以方便地來往。一對城 市之間可能存在多條道路。據史料...
BZOJ3195 Jxoi2012 奇怪的道路
time limit 10 sec memory limit 128 mb 小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為1.n。m條道路連線在這些城市之間,每條道路將兩個城市連線起來,使得兩地的居民可以方便地...
bzoj3195 Jxoi2012 奇怪的道路
time limit 10 sec memory limit 128 mb submit 544 solved 354 submit status discuss 小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為...