BZOJ 1875 HH去散步 矩陣快速冪

2022-05-26 23:45:15 字數 1296 閱讀 8358

題意:

給定一張無向圖,每條路的長度都是1,沒有自環,可能有重邊,給定起點與終點,求從起點走t步到達終點的方案數。 

每一步走的時候要求不能走上一條剛剛走的路。 

解析:

顯然需要搞出個矩陣之後矩乘。 

然而這題的要求就很煩,要不然就是sb題了2333. 

但是我們可以換乙個想法來做。 

題目要求不走上一條來的邊,況且邊的數量還很少,所以我們可以考慮將矩陣構造成從一條邊走到另一條邊的方案數。 

這樣的話我們避免走上一條來的路就很簡單的能判斷了。 

構造出初始矩陣後,我們求該矩陣的t-1次方。 

然後再用起點走一步能到的邊的矩陣乘以該矩陣。 

之後起點到鏈結終點的邊的所有方案數之和即為答案。

#include #include 

#include

#include

#define mod 45989

#define n 22

using

namespace

std;

intn,m,t,a,b;

struct

matrix

friend matrix

operator * (matrix &a,matrix &b)

ret.map[i][j]%=mod;}}

return

ret;

}friend matrix

operator ^ (matrix &a,int

b)

return

ret;

}}ori,

base

;int

head[n],cnt;

struct

node

edge[n*6

];void

init()

void edgeadd(int

from,int

to)int

main()

for(int i=head[a];i!=-1;i=edge[i].next)

base.map[0][i]++;

for(int i=1;i)

}ori=ori^(t-1

);

base=base*ori;

int sum=0

;

for(int i=1;i)

printf(

"%d\n

",sum);

}

view code

樹狀陣列 BZOJ1878 HH的項鍊

hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不同 的貝殼?這個問題很難回答。因為項鍊實在是太長了。於是...

bzoj1878 HH的項鍊(莫隊)

這篇部落格簡要介紹下我對莫隊的理解。莫隊是一種複雜度為o n sqrt n 的演算法。具體思路是 通過區間左端點的左移和右移與區間右端點的左移和右移來進行更新 排序的時候進行分塊操作,目的是減少左移右移的次數。分塊的話假設序列個數是n,那麼就分為sqrt n 塊,然後根據塊進行排序 就是先將要查詢的...

樹狀陣列 BZOJ1878 HH的項鍊

hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不同 的貝殼?這個問題很難回答。因為項鍊實在是太長了。於是...