BZOJ3583 傑杰的女性朋友 矩陣快速冪

2022-03-28 05:55:40 字數 3574 閱讀 9718

時間限制:10s      空間限制:256mb

傑杰是魔法界的一名傳奇人物。他對魔法具有深刻的洞察力,驚人的領悟力,以及令人嘆為觀止的創造力。自從他從事魔法競賽以來,短短幾年時間,就已經成為 世界公認的實力最強的魔法選手之一。更讓人驚嘆的是,他幾乎沒有借助外界力量,完全憑藉自己的努力達到了普通人難以企及的高度。在最近的世界魔法奧林匹克 競賽上,他使用高超的魔法本領,一路過關斬將,在最後時刻一舉擊敗了前冠軍「旅行者」,獲得了魔法界最高的榮耀:女神獎盃!女神獎盃可不是乙個普通的獎 杯,她能夠幫傑傑實現乙個願望。

傑杰本著實事求是的態度,審時度勢,向女神獎盃提出了自己的願望:想要乙個女性朋友。

傑杰的願望實現了,可是女性朋友卻和他不在乙個城市。傑杰想要知道:如果要到達女性朋友的所在城市,有多少種方案供他選擇?

傑杰所在的世界有n個城市,從1到n進行編號。任意兩個城市都通過有向道路連線。每個城市u有k個入點權:in[u][1],in[u]

[2]...in[u][k],有k個出點權:ou[u][1],ou[u][2]...ou[u][k]。對於任意兩個城市(u,v)(u可以等於

v),u到v的道路條數為(ou[u][1]*in[v][1]+ou[u][2]*in[v][2]+...+ou[u][k]*in[v][k])

條。傑杰有m次詢問,每次詢問由三元組(u,v,d)構成,詢問從u城市通過不超過d條道路到達v城市的方案數。

為了溫柔的傑杰和他的女性朋友的美好未來,幫助他解答這個問題吧。

第一行讀入兩個正整數n,k,含義如題所示。

接下來n行每行2k個整數,第i行代表第i個城市,前k個整數代表i號城市的出點權,後k個整數代表i號城市的入點權:

ou[i][1],ou[i][2],…,ou[i][k],in[i][1],in[i][2],…,in[i][k]

接下來乙個整數m,表示m個詢問。

接下來m行,每行三個整數:u,v,d,詢問從u城市通過不超過d條道路到達v城市的方案數。

將每個方案所經過的道路,按順序寫成乙個序列(序列可以為空)。兩個方案不同,當且僅當他們的道路序列不完全相同。

對於每個詢問,輸出乙個方案數。由於答案可能太大,輸出其除以1000000007後的餘數。

5 2

2 5 4 3

7 9 2 4

0 1 5 2

6 3 9 2

2147483647 1000000001 233522 788488

101 1 0

2 2 1

2 4 5

4 3 10

3 4 50

1 5 1000

3 5 1000000000

1 2 500000000

4 5 2147483647

3 1 2147483647

1

51170107227

271772358

34562176

890241289

8516097

383966304

432287042

326522835

資料規模和約定

n<=1000

k<=20

m<=50

保證1<=u, v<=n, 其它所有讀入為不超過2147483647的非負整數

by 佚名提供

fjoi201

8一試就是直接使用了這道清華集訓原題。

首先列出dp狀態轉移方程,$f[t][i]$表示走了$t$步之後到達$i$節點的方案數:$$f[t][i]=\sum\limits_^ (f[t-1][j]*\sum\limits_^ o_*i_)$$

這樣做的複雜度是$o(n^2d)$,而 $d \leqslant 2^-1$,顯然無法在時限內出解。

觀察這個轉移方程,不難看出這是裸的矩陣快速冪,於是可以在$o(n^3 \log d)$時間內出解。

然而這個複雜度仍然不夠優,事實上,連fjoi2018現場最低的一檔部分分都無法通過。

於是需要進一步觀察矩陣的性質:

$f$是乙個$1*n$的矩陣,$o$是乙個$n*k$的矩陣,$i$是$n*k$的,而$c=oi^t$所以$c$是$n*n$的。由資料範圍可知,如果我們能將$n*n$的矩陣乘法優化到$k*k$,那麼就可以通過全部資料。

不難發現答案$$f[d]=f[0]*c^d=f[0]*(oi^t)^d=f[0]*o*(i^to)^*i$$而$i^to$是$k*k$的,所以我們只要求$d=i^to$就好了。

但是還有乙個問題,題目要求的是$$\sum\limits_^ f[i]$$ 也就是$$f[0]+f[0]*oo)}^i +f[0]*o(i^to)^i+ \ldots +f[0]*o(i^to)^i\\=f[0]*o*(\sum\limits_^d^)*i$$這種涉及到冪和的問題就不能直接使用矩陣快速冪解決。

我們可以首先預處理出所有$a_i=d^ (i=0,1,2,...)$,$b_i=\sum\limits_^ d^ (i=0,1,2,...) $,故$b_i=b_a_i$

這樣我們有$$\sum\limits_^d^=e+(d+d^+...+d^)+(d^+1}+d^+2}+...+d^)+...$$其中$d_i$為d的二進位制第i個1代表的數。$e$為單位矩陣

對於每個括號分別考慮,$$d+d^+...+d^=b^$$$$d^+1}+d^+2}+...+d^=(b_*a_)$$

以此類推,就可以得到最終的答案。**片段如下:

rep(i,1,m) rep(j,1,m) b[0][i][j]=a[0

][i][j];

rep(i,

0,l-2

)

1

void cal(int

n)9 }

剩下的只要根據輸入資料建矩陣即可

1 #include2 #include3

#define rep(i,l,r) for (int i=l; i<=r; i++)

4using

namespace

std;56

const

int n=1010,k=21,l=31,p=1000000007;7

intn,m,q,x,y,z,ans,o[n][k],i[n][k],f[n];

8int

s[k][k],g[k][k],a[l][k][k],b[l][k][k],c[k][k];910

void up(int &a,int b)

11void mul(int a[k],int

b[k])

1516

void cal(int

n)24}25

26int

main()

34 rep(k,1,n) rep(i,1,m) rep(j,1,m) a[0][i][j]=(a[0][i][j]+1ll*i[k][i]*o[k][j])%p;

35 rep(i,1,m) rep(j,1,m) b[0][i][j]=a[0

][i][j];

36 rep(i,0,l-2

)44 scanf("

%d",&q);

45while (q--)

52return0;

53 }

BZOJ3583 傑杰的女性朋友 矩陣

有乙個 n 個點構成的有向圖。對於每乙個點 i 給定兩組引數,每組引數分別有 k 個值。這兩組引數分別記做 in i 1 cdots k out i 1 cdots k 從點 i 連到點 j 的邊數定義為 sum k in i t times out i t m 組詢問,每次詢問從 點 x 走到點 ...

刷題集 傑杰的女性朋友

題意 傑杰是魔法界的一名傳奇人物。他對魔法具有深刻的洞察力,驚人的領悟力,以及令人嘆為觀止的創造力。自從他從事魔法競賽以來,短短幾年時間,就已經成為世界公認的實力最強的魔法選手之一。更讓人驚嘆的是,他幾乎沒有借助外界力量,完全憑藉自己的努力達到了普通人難以企及的高度。在最近的世界魔法奧林匹克競賽上,...

BZOJ3450 BZOJ4318 期望的線性性質

這兩個題的套路是一樣的,放在一起說。因為期望有線性性質,也就是說我們可以分開算每一位的期望,再加起來就是答案。由於e x 1 2 x 2 2 e x 1e x 1 2 x2 2e x 1,所以我們只需要維護乙個期望長度即可,維護的方法十分簡單,相信聰明的你很快就能明白。include using n...