該題非常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 統計邊...