ZJOI2005 沼澤鱷魚 題解報告

2022-02-28 02:36:31 字數 2697 閱讀 2873

潘塔納爾沼澤地號稱世界上最大的一塊濕地,它地位於巴西中部馬托格羅索州的南部地區。每當雨季來臨,這裡碧波蕩漾、生機盎然,引來不少遊客。

為了讓遊玩更有情趣,人們在池塘的**建設了幾座石墩和石橋,每座石橋連線著兩座石墩,且每兩座石墩之間至多只有一座石橋。這個景點造好之後一直沒敢對外開放,原因是池塘裡有不少危險的食人魚。

豆豆先生酷愛冒險,他一聽說這個訊息,立馬趕到了池塘,想做第乙個在橋上旅遊的人。雖說豆豆愛冒險,但也不敢拿自己的性命開玩笑,於是他開始了仔細的實地勘察,並得到了一些驚人的結論:食人魚的行進路線有週期性,這個週期只可能是2,3或者4個單位時間。每個單位時間裡,食人魚可以從乙個石墩游到另乙個石墩。每到乙個石墩,如果上面有人它就會實施攻擊,否則繼續它的週期運動。如果沒有到石墩,它是不會攻擊人的。

借助先進的儀器,豆豆很快就摸清了所有食人魚的運動規律,他要開始設計自己的行動路線了。每個單位時間裡,他只可以沿著石橋從乙個石墩走到另乙個石墩,而不可以停在某座石墩上不動,因為站著不動還會有其它危險。如果豆豆和某條食人魚在同一時刻到達了某座石墩,就會遭到食人魚的襲擊,他當然不希望發生這樣的事情。

現在豆豆已經選好了兩座石墩start和end,他想從start出發,經過k個單位時間後恰好站在石墩end上。假設石墩可以重複經過(包括start和end),他想請你幫忙算算,這樣的路線共有多少種(當然不能遭到食人魚的攻擊)。

輸入格式:

輸入檔案共m + 2 + nfish行。

第一行包含五個正整數n,m,start,end和k,分別表示石墩數目、石橋數目、start石墩和end石墩的編號和一條路線所需的單位時間。石墩用0到n–1的整數編號。

第2到m + 1行,給出石橋的相關資訊。每行兩個整數x和y,0 ≤ x, y ≤ n–1,表示這座石橋連線著編號為x和y的兩座石墩。

第m + 2行是乙個整數nfish,表示食人魚的數目。

第m + 3到m + 2 + nfish行,每行給出一條食人魚的相關資訊。每行的第乙個整數是t,t = 2,3或4,表示食人魚的運動週期。接下來有t個數,表示乙個週期內食人魚的行進路線。

 如果t=2,接下來有2個數p0和p1,食人魚從p0到p1,從p1到p0,……;

 如果t=3,接下來有3個數p0,p1和p2,食人魚從p0到p1,從p1到p2,從p2到p0,……;

 如果t=4,接下來有4個數p0,p1,p2和p3,食人魚從p0到p1,從p1到p2,從p2到p3,從p3到p0,……。

豆豆出發的時候所有食人魚都在自己路線上的p0位置,請放心,這個位置不會是start石墩。

輸出格式:

輸出路線的種數,因為這個數可能很大,你只要輸出該數除以10000的餘數就行了。

輸入樣例#1:

6 8 1 5 3

0 22 1

1 00 5

5 11 4

4 33 5

13 0 5 1

輸出樣例#1:

2

 1 ≤ n ≤ 50

 1 ≤ k ≤ 2,000,000,000

 1 ≤ nfish ≤ 20

每一道debug了很久又很有收穫的題都要記下來√

在寫這道題之前,我們先了解鄰接矩陣乘法的意義

什麼鄰接矩陣還有乘法?

想想對於,g[i][j],如果存在i->j的邊那麼g[i][j]=1

如果我們把這看做g的一次冪,理解為只走一步時i->j的路線條數【當然肯定是1啦。。】

對於g^2呢?

對於所有的g[i][k]和g[k][j],都會相乘且結果存在最後的g'[i][j]中,難道這不是走兩步時i->j的路線麼?

由此,對於任意g^n[i][j],表示從i出發走n步到j的方案數【可以中途經過j】

典題:給定一張圖,求從i出發走k步到j的方案數。

有了這樣的知識儲備,似乎解出這道題就不是難事了。

等等。。食人魚怎麼考慮?

仔細觀察,食人魚的週期很小,為2,3,4,最小公倍數是12

也就是說,我們可以對12個時間內每個時間點建乙個鄰接矩陣,然後順次【注意是順次,矩陣乘法沒有交換律】相乘

為了降低複雜度,其中[k/12]組可以放在一起用快速冪算出

坑點:1、注意正確把握週期時間點,從a[1]乘到a[11]再乘a[0]

1、矩陣乘法沒有交換律,得先預處理q=a[1]*a[2]*......*a[11]*a[0],再用算出q^[k/12],對於剩下的,從a[1]開始乘完k%12個【這個坑了我好久】

3、標號從0開始= =

#include#include#include#include#define ll long long int

using namespace std;

const int maxn=55,inf=2000000000,p=10000;

inline int read()

while(c>=48&&c<=57)

return out*flag;

}struct matrix

}a[20],q;

inline matrix operator *(const matrix& a,const matrix& b)

matrix qpow(matrix a,ll b)

int n,m,s,e,k,uns[20][maxn],g[maxn][maxn];

void init()

int nf=read(),t,u;

while(nf--){

t=read();

for(int i=0;i

ZJOI2004 沼澤鱷魚

給定乙個無向圖,以及起點s和終點t。每單位時間可以從乙個點走向聯通的另乙個點,問從起點s出發,經過k單位時間到達終點t的方案總數。最多50個點,k小於等於10 9。另 某一週期 週期時間為2,3或4 內一些點不能走到。到達某一點的方案總數,需要想到由加法原理進行遞推。記f u,k 為k秒後到達u點的...

ZJOI 2005 夢幻摺紙

給乙個 n m 的網格圖,每個網格上有 1,n m 的數字,且每個都出現且恰好出現一次.顯然進行若干次摺疊直到剩下乙個 1 1 的小網格時,它在縱向上有 n m 層.那麼能否安排一種摺疊方案,使得這 n m 層從上往下的標號恰好為 1 到 n m 顯然每個縱向和橫向的格線都會被折到.我們觀察剩下的的...

省選專練ZJOI2005午餐

這是個好題 考察dp優化,dp,貪心,01揹包變種。好首先對吃飯時間從大到小排序,因為一隊人打飯時長總和一樣。dp i,j 表示前i個人,第一組用j的時間。放第乙個揹包 dp i j min max dp i 1 j a i w j a i v 放第二個揹包 dp i j min max dp i ...