HDU 5607 graph 矩阵快速幂 + 快速幂
这道题得到了学长的助攻,其实就是一个马尔科夫链,算出一步转移矩阵进行矩阵快速幂就行了,无奈手残
这是我第一回写矩阵快速幂,写的各种毛病,等到调完了已经8点44了,交了一发,返回PE,(发现是少了换行)再想交的时候已经开始hack了
真是TMD。。。。。。。,然后rejudge完了之后再HDOJ上瞬间AC,真是。。。狗了,只能是自己手残
手残,手残,手残(重要的事情说三遍)
思路 :(杭电官方题解,我就不班门弄斧了。。QAQ)
考虑dpdp,用f_{t,x}ft,x表示第tt秒在xx的概率,初始时f_{0,u}=1f0,u=1.
f_{t+1,y}=\sum_{x,x->y}{\frac{f_{t,x}}{Out_x}},Out_xft+1,y=∑x,x−>yOutxft,x,Outx表示xx的出度.
因为tt很大,而且发现每次的转移都是相同的,所以直接矩乘就好了.
复杂度是O(QN^3\log t)O(QN3logt).
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<queue>
using namespace std;
typedef long long LL;
const int maxn=+;
const LL mod=1e9+;
vector<int>g[maxn];
int n,m;
LL xx[maxn][maxn],yy[maxn][maxn];
struct mat
{
LL x[maxn][maxn],y[maxn][maxn];
} o,res;
mat mul(mat a,mat b)
{
mat temp;
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j)
{
temp.x[i][j]=;
temp.y[i][j]=;
for(int k=; k<=n; ++k)
{
LL t1=a.x[i][k]*b.x[k][j]%mod;
LL t2=a.y[i][k]*b.y[k][j]%mod;
temp.x[i][j]=(temp.x[i][j]*t2%mod+temp.y[i][j]*t1%mod)%mod;
temp.y[i][j]=(temp.y[i][j]*t2)%mod;
}
}
return temp;
}
void cal(int c)
{
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j)
{
o.x[i][j]=xx[i][j];
o.y[i][j]=yy[i][j];
res.x[i][j]=,res.y[i][j]=;
}
for(int i=; i<=n; ++i)
res.x[i][i]=;
while(c)
{
if(c&)
res=mul(res,o);
c>>=;
o=mul(o,o);
}
}
LL getans(LL x,LL y)
{
int c=1e9+;
LL r=;
while(c)
{
if(c&)
r=(r*y)%mod;
c>>=;
y=(y*y)%mod;
}
r=(x%mod*r%mod);
return r;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(xx,,sizeof(xx));
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
yy[i][j]=;
for(int i=; i<=n; ++i)
g[i].clear();
for(int i=; i<m; ++i)
{
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
}
for(int i=; i<=n; ++i)
{
for(int j=; j<g[i].size(); ++j)
xx[i][g[i][j]]=,yy[i][g[i][j]]=g[i].size();
}
int q;
scanf("%d",&q);
while(q--)
{
int u,k;
scanf("%d%d",&u,&k);
cal(k);
for(int i=; i<=n; i++)
printf("%I64d ",getans(res.x[u][i],res.y[u][i]));
printf("\n");
}
}
return ;
}
HDU 5607 graph 矩阵快速幂 + 快速幂的更多相关文章
- hdu 5607 graph (矩阵乘法快速幂)
考虑一个经典的问题: 询问从某个点出发,走 k 步到达其它各点的方案数? 这个问题可以转化为矩阵相乘,所以矩阵快速幂即可解决. 本题思路: 矩阵经典问题:求从i点走k步后到达j点的方案数(mod p) ...
- HDU 5607 graph(矩阵优化+概率DP)
该题非常easy想到求概率的转移方程:用d[i][j]表示第i步,走到j点的概率. 可是该题的k高达1e9.所以依照套路.要用矩阵相乘来优化. 第一次写矩阵相乘. 大概的意思就是利用矩阵实现递推. 而 ...
- HDU 5607 graph(DP+矩阵乘法)
[题目链接] http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=663&pid=1002 [题意] 给定一个有向 ...
- HDU 5607 graph(矩阵乘法)
题意 在一个 \(n\) 个节点 \(m\) 条边的有向图上随机游走,有 \(Q\) 个询问,每次给定一个起点 \(u\) 和步数 \(K\) ,每次回答最后停在每个节点的概率. \(1 \leq n ...
- HDU.2640 Queuing (矩阵快速幂)
HDU.2640 Queuing (矩阵快速幂) 题意分析 不妨令f为1,m为0,那么题目的意思为,求长度为n的01序列,求其中不含111或者101这样串的个数对M取模的值. 用F(n)表示串长为n的 ...
- HDU 5667 构造矩阵快速幂
HDU 5667 构造矩阵快速幂 题目描述 解析 我们根据递推公式 设 则可得到Q的指数关系式 求Q构造矩阵 同时有公式 其中φ为欧拉函数,且当p为质数时有 代码 #include <cstdi ...
- HDU 4549 矩阵快速幂+快速幂+欧拉函数
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- hdu 5690 2016"百度之星" - 初赛(Astar Round2A) All X 快速二次幂 || 寻找周期
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5690 题意:m个数字全为x mod k ?= c;其中m <= 1010,0 < c,k ...
- Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)
Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...
随机推荐
- Android中Google地图路径导航,使用mapfragment地图上画出线路(google map api v2)详解
在这篇里我们只聊怎么在android中google map api v2地图上画出路径导航,用mapfragment而不是mapview,至于怎么去申请key,manifest.xml中加入的权限,系 ...
- collectionView代码创建
@interface ViewController ()<UICollectionViewDataSource,UICollectionViewDelegateFlowLayout> @p ...
- shell复习笔记----查找与替换
查找文档 以grep 程序查找文本(匹配文本 matching text)相当方便.传统上有三种程序可以用来查找整个文本文件. grep 最早的文本匹配程序.其最简单的方式就是使用固定字符串 $ wh ...
- SNMP的工作原理&软件开发
SNMP(Simple Network Management Protocol,简单网络管理协议)首先是由IETF的研究小组为了解决Internet上的路由器管理问题而提出的.SNMP的设计原则是简单 ...
- js按钮点击展开收起
$('.tab').click(function(){ var index = $('.tab').index(this), //缓存第一次点击的li的索引值 ele = $(this).find(' ...
- 通过SQL Server 2008 访问MySQL(转)
在公司中经常会遇到部署多种数据库环境的情况,对于开发人员来说经常在不同数据库之间转换确实有些繁琐,本篇将介绍从SQL Server 操作MySQL 数据库的方法. 数据库测试环境 1. SQL Ser ...
- Clojure语法学习-循环
do和块语句 在Scala中,花括号{}括起来的语句构成一个block,它的值就是最后一个语句的值. scala> val a = { | println("a") | 1} ...
- 一个简单的C#加密解密类
//DES默认密钥向量 private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; /// < ...
- ecos内核概览--bakayi译
http://blog.csdn.net/wangzaiwei2006/article/details/6453423
- centos6.5下Zabbix系列之Zabbix安装搭建及汉化
最近在研究zabbix,在整理完成之后就有了写一下总结博客的想法,在我研究zabbix的时候给我很大帮助的是it你好,博客地址http://itnihao.blog.51cto.com/他做的zabb ...