fjoi201時間限制: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 22 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 佚名提供
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
)
1void 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...