HDU 5607 graph(矩陣優化 概率DP)

2021-09-07 16:52:35 字數 1314 閱讀 5250

該題非常easy想到求概率的轉移方程:用d[i][j]表示第i步,走到j點的概率。

可是該題的k高達1e9。所以依照套路。要用矩陣相乘來優化。

第一次寫矩陣相乘。 大概的意思就是利用矩陣實現遞推。 而且由於每次遞推的過程一樣, 所以就相當於右乘這個矩陣的k次方。

用矩陣高速冪就可以。

矩陣相乘這個問題, 大概能夠看成, 矩陣中的每乙個元素表示到該點的概率, 那麼還有乙個矩陣就是dp矩陣, 表示當前一步到各點的概率。 矩陣相乘就等於下一步到各點的概率(矩陣乘法的意義)。

另外。 要對答案進行1e9+5次方再取模, 假設最後取模。 那麼將對分母y進行取模後再次方再取模, 這是和原問題不等價的, 所以解決方法是依照乘法取模公式。 先對矩陣元素提前處理該操作。

細節參見**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

using namespace std;

typedef long long ll;

const double pi = acos(-1.0);

const double eps = 1e-6;

const int inf = 1000000000;

const int mod = 1000000000 + 7;

const int maxn = 1000 + 10;

ll t,n,q,u,k,m,x,y,cnt[maxn];

vectorg[maxn];

typedef vectorvec;

typedef vectormat;

mat mul(mat &a, mat &b) }}

return c;

}mat pow(mat a, ll k)

while(k > 0)

return b;

}ll mod_pow(ll x, ll n, ll mod)

return res;

}int main()

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

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

}scanf("%i64d",&q);

while(q--)

printf("\n");}}

return 0;

}

HDU 5607 graph(矩陣乘法)

在乙個 n 個節點 m 條邊的有向圖上隨機遊走,有 q 個詢問,每次給定乙個起點 u 和步數 k 每次回答最後停在每個節點的概率。1 leq n leq 50 1 leq m leq 1000 1 leq q leq 20 1 leq k leq 10 9 同樣構造乙個 起始矩陣 a 和乙個 轉移矩...

HDU 5607 graph(矩陣優化 概率DP)

該題非常easy想到求概率的轉移方程 用d i j 表示第i步,走到j點的概率。可是該題的k高達1e9。所以依照套路。要用矩陣相乘來優化。第一次寫矩陣相乘。大概的意思就是利用矩陣實現遞推。而且由於每次遞推的過程一樣,所以就相當於右乘這個矩陣的k次方。用矩陣高速冪就可以。矩陣相乘這個問題,大概能夠看成...

HDU 4467 Graph(莫隊思想)

題意 給你n個點,m條邊,每條邊有乙個權值,有兩個操作,乙個是修改單點的顏色 顏色只有0,1兩種 乙個是詢問邊的兩個端點都為指定顏色的權值和。思路 由於每個點的顏色只有0,1兩種,那麼答案只有3種情況 00,01,11 用乙個陣列維護即可。即ans 0 統計邊的兩端都是0的權值和,ans 1 統計邊...