給定乙個無向圖,以及起點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...