ZJOI2004 沼澤鱷魚

2021-08-06 08:18:51 字數 2232 閱讀 7689

給定乙個無向圖,以及起點s和終點t。每單位時間可以從乙個點走向聯通的另乙個點,問從起點s出發,經過k單位時間到達終點t的方案總數。

最多50個點,k小於等於10^9。

另:某一週期(週期時間為2,3或4)內一些點不能走到。

到達某一點的方案總數,需要想到由加法原理進行遞推。記f(

u,k)

為k秒後到達u點的方案總數,那麼有 f(

u,k)

=∑(u

,v)∈

ef(v

,k−1

) 資料範圍點數較小,時間極大,立刻觸發使用快速冪倍增的想法。由於遞推式是有限點的線性遞推式,可以寫成矩陣形式(m

,其中m

u,v=

mv,u

=1) ,因而確實可以使用矩陣快速冪。

再來考慮某一時刻有些點無法到達,即f(

u,k)

=0,這時只要令mu

,i=0

即可。由於週期只有2,3,4三種情況,取其最小公倍數12,計算12秒內的狀態轉移矩陣,並相乘作為乙個轉移週期。這樣做k/12次整週期快速冪和k%12次部分快速冪即得k次後的方案數。

注意矩陣是左乘,複雜度o(

logn

∗n3)

利用矩陣刻畫固定的、線性的狀態轉移方程,以求利用矩陣快速冪進行加速,是動態規劃的一種常見加速技巧。曾在ac自動機dp問題中出現(poj dna sequence)。

侷限:狀態數要少

轉移要是線性的

轉移方程是固定的,或者在週期的意義下是固定的

其它方法,狀態數很多,但轉移的狀態有限,相對當前狀態固定,轉移次數較少:

例如: f(

i)=∑

lk=1

f(i−

k),生成函式(x

+x2+

...+

xl)i

因為 (f

(0)+

f(1)

x+..

.+f(

n−l)

xn−l

+...

+f(n

−1)x

n−1)

∗(x+

x2+.

..+x

l)對於xn

的係數就是f(

n)=∑

lk=1

f(n−

k)但是這個貌似只有理論上的用途,實際求f(n),最後的多項式有l*k次,如果n很大,大於10^5,fft+快速冪仍然吃不消(o(

logn

∗(nl

)log

(nl)

) ),除非l很大,n較小,這個時候就可以做了。對於特定的題目n很大還是有用的,比如hdu6050,要先求通項再將特徵根代入生成函式,因為只用到了理論概念並不涉及機器計算。

#include 

using

namespace

std;

const

int mo=10000;

inline

void add(int &x,int y)

struct matrix

return ans;

} void unit()

} void clear(int x,int y)

} matrix operator^(const

int& index) const

return ans;

}};matrix g[20],pe,re;

int in[60],p[5],out[60];

int main()

cin>>nfish;

while (nfish--)

for (i=0;i<12;i++)

}int index=k/12;

k%=12;

re.n=re.m=n;

re.unit();pe=re;

for (i=1;i<=12;i++)

pe=pe^index;

pe=re*pe;

for (i=1;i<=12;i++) in[i]=out[i]=0;

in[s]=1;

for(i=1;i<=n;i++)

for (j=1;j<=n;j++)

add(out[i],pe.a[i][j]*in[j]%mo);

cout

0;}

ZJOI2005 沼澤鱷魚 題解報告

潘塔納爾沼澤地號稱世界上最大的一塊濕地,它地位於巴西中部馬托格羅索州的南部地區。每當雨季來臨,這裡碧波蕩漾 生機盎然,引來不少遊客。為了讓遊玩更有情趣,人們在池塘的 建設了幾座石墩和石橋,每座石橋連線著兩座石墩,且每兩座石墩之間至多只有一座石橋。這個景點造好之後一直沒敢對外開放,原因是池塘裡有不少危...

ZJOI2004 樹的果實

森林中生長著許多奇特的果樹,它們不僅外形獨特,其果實更是可口。這天,兩隻小蟲nileh和nixed決定一起分享一顆果樹。他們從早晨一直辛勤工作到下午,終於把這顆果樹鋸倒。他們觀察著這顆果樹,果樹開始端是露出地面的根部,接著像其他果樹一樣,有著諸多分叉 如圖所示就是一顆果樹 在每個分叉處生長著果實,自...

ZJOI 2004 嗅探器 題解

題目傳送門 題目大意 給出一張無向圖以及兩個點 stst st和 eded ed,找出乙個編號最小的並且在所有st 到 ed 的路徑上的點。顯然這個點是乙個割點嘛。於是我們找出所有滿足要求的割點中編號最小的即可。具體就看 吧 include include define maxn 110 int n...