题意

在一个 \(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_{1n}\) 和一个“转移矩阵” \(B_{nn}\) 。如果知道 \(B_{i,j}\) 的含义,就是 \(i\) 点到 \(j\) 点的“转移系数” ,矩阵乘法就不是问题了。

对于每个询问 \((u,K)\) ,\(A_{1,u}=1\) ,\(B_{i,j}\) 为 \(i\) 点走到 \(j\) 点的概率,然后输出 \(A*B^K\) 矩阵的每一项即可。

代码

#include<bits/stdc++.h>
#define FOR(i,x,y) for(int i=(x),i##END=(y);i<=i##END;++i)
#define DOR(i,x,y) for(int i=(x),i##END=(y);i>=i##END;--i)
typedef long long LL;
using namespace std;
const int N=55;
const int M=1005;
const int P=1e9+7;
struct Matrix
{
int n,m,a[N][N];
int *operator [](const int x){return a[x];}
void resize(int _n,int _m){n=_n,m=_m;}
Matrix operator *(const Matrix &_)const
{
Matrix res;res.resize(n,_.m);
FOR(i,1,n)FOR(j,1,_.m)
{
res[i][j]=0;
FOR(k,1,m)(res[i][j]+=1ll*a[i][k]*_.a[k][j]%P)%=P;
}
return res;
}
Matrix operator *=(const Matrix &_){return (*this)=(*this)*_;}
};
LL inv[M];
Matrix A,B;
int oud[N],U[M],V[M];
int n,m,Q; Matrix Pow(Matrix a,int p)
{
Matrix res;res.resize(a.n,a.n);
FOR(i,1,res.n)FOR(j,1,res.n)res[i][j]=(i==j);
for(;p>0;p>>=1,a*=a)if(p&1)res*=a;
return res;
}
LL frac(LL x,LL y){return x*inv[y]%P;} int main()
{
inv[0]=inv[1]=1;FOR(i,2,N-1)inv[i]=(P-P/i)*inv[P%i]%P;
while(~scanf("%d%d",&n,&m))
{
A.resize(1,n),B.resize(n,n);
memset(oud,0,sizeof(oud));
FOR(i,1,m)scanf("%d%d",&U[i],&V[i]),oud[U[i]]++;
FOR(i,1,n)FOR(j,1,n)B[i][j]=0;
FOR(i,1,m)(B[U[i]][V[i]]+=frac(1,oud[U[i]]))%=P;
scanf("%d",&Q);
while(Q--)
{
int u,K;
scanf("%d%d",&u,&K);
FOR(i,1,n)A[1][i]=(i==u);
A*=Pow(B,K);
FOR(i,1,n)printf("%d ",A[1][i]);
puts("");
}
}
return 0;
}

HDU 5607 graph(矩阵乘法)的更多相关文章

  1. HDU 5607 graph 矩阵快速幂 + 快速幂

    这道题得到了学长的助攻,其实就是一个马尔科夫链,算出一步转移矩阵进行矩阵快速幂就行了,无奈手残 这是我第一回写矩阵快速幂,写的各种毛病,等到调完了已经8点44了,交了一发,返回PE,(发现是少了换行) ...

  2. HDU 5607 graph(DP+矩阵乘法)

    [题目链接] http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=663&pid=1002 [题意] 给定一个有向 ...

  3. HDU 5607 graph(矩阵优化+概率DP)

    该题非常easy想到求概率的转移方程:用d[i][j]表示第i步,走到j点的概率. 可是该题的k高达1e9.所以依照套路.要用矩阵相乘来优化. 第一次写矩阵相乘. 大概的意思就是利用矩阵实现递推. 而 ...

  4. hdu 5607 graph (矩阵乘法快速幂)

    考虑一个经典的问题: 询问从某个点出发,走 k 步到达其它各点的方案数? 这个问题可以转化为矩阵相乘,所以矩阵快速幂即可解决. 本题思路: 矩阵经典问题:求从i点走k步后到达j点的方案数(mod p) ...

  5. HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)

    传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/detai ...

  6. HDU 2604 Queuing (矩阵乘法)

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. HDU 5863 cjj's string game (矩阵乘法优化递推)

    题目大意:用k种字符构建两个长度为n的字符串(每种字符有无限多个),要求对应位置字符相同的连续子串最长长度为m,问方法数. 其中k,n,m是输入,n(1<=n<=1000000000), ...

  8. Hdu 2157 How many ways??(DP||矩阵乘法)

    How many ways?? Time Limit:1000 MS Memory Limit: 32768 K Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, ...

  9. *HDU 1757 矩阵乘法

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

随机推荐

  1. Fantasia (点强连通分量建图 + 树形DP)

    简化一下题意,我们先看成一副强连通的图,这时候应该是最简单了,去点任意点都是其他的乘积.那再加强一点难度,改为两个强连通图连接的非强连通图呢?那应该就是找出关键的那个点,并求出两边的乘积.但是一个一个 ...

  2. margin、padding、border区分

    margin 是设置两个标签的间隔,也就是距离: padding 这个是比如一个p标签,它是100px*100px,我们使用的时候p标签的文字是贴着p标签的最左侧的,想要它的文字距离边界远一点,好看一 ...

  3. JQuery ajax请求返回(parsererror)异常处理

    目前在学习一个Java应用的框架,反编译后在执行时一直报错,界面上显示”parsererror”,经过JavaScript调试后发现更详细的错误提示信息是 Unexpected token ' in ...

  4. Java用Jackson遍历json所有节点

    <!-- jackson begin --> <dependency> <groupId>com.fasterxml.jackson.core</groupI ...

  5. 【linux应用】将一个大文件按行拆分成小文件

    例如将一个BLM.txt文件分成前缀为 BLM_ 的1000个小文件,后缀为系数形式,且后缀为4位数字形式 先利用 wc -l BLM.txt #读出BLM.txt有多少行. 再利用 split 命令 ...

  6. show processlist命令与kill 线程

    show [full] processlist show processlist显示正在运行的线程.如果有process权限,则可以查看所有正在运行的线程.否则,只能看到自己的线程.如果不使用full ...

  7. Django自定义装饰器

    装饰器模板: def decorator(func): def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper ...

  8. git小技巧--如何从其他分支merge个别文件或文件夹

    在实际工作中,一个大型的项目或版本迭代可能不是一次上线,可能会分好几次上线,这时候就会涉及创建多个分支,进行分别开发. 创建分支 功能分为2个分支,分别为A.B. A上面有个列表页功能 B上面有个详情 ...

  9. fjwc2019 D2T3 排序(堆)

    #183. 「2019冬令营提高组」排序 贴一段ppt 考虑模拟出这个算法进行k轮(即外层的i循环到k)时的序列,之后再暴力模拟零散的步. 考虑这个算法在01序列上的表现,k轮后实际上就是将最开始的不 ...

  10. atomic 原子操作

    原子操作:操作仅由一个独立的CPU指令代表和完成.保证并发环境下原子操作的绝对安全 标准库代码包:sync/atomic atomic是最轻量级的锁,在一些场景下直接使用atomic包还是很有效的 C ...