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个数表示矩阵 ...
随机推荐
- webx学习笔记
Webx学习笔记周建旭 2014-08-01 Webx工作流程 图 3.2. Webx Framework如何响应请求 当Webx Framework接收到一个来自WEB的请求以后,实际上它主要做了两 ...
- IIS (HTTP Error 500.21 - Internal Server Error)解决
今天在测试网站的时候,在浏览器中输入http://localhost/时,发生如下错误: HTTP Error 500.21 - Internal Server Error Handler " ...
- poj City Horizon (线段树+二分离散)
http://poj.org/problem?id=3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissi ...
- 1874 素数和最大 - Wikioi
题目描述 Description 有一天萌萌哒Sevenkplus在跟素数们玩>_<...他玩着玩着突然想到一个问题!就是这样的: 从1到n这n个自然数中,选出一些数使得它们之间两两 ...
- PAT-乙级-1043. 输出PATest(20)
1043. 输出PATest(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一个长度不超过10000 ...
- KafkaSpout: PartitionManager的行为分析
KafkaSpout的核心逻辑都是由PartitionManager来实现的. 但是这个类实现时候需要考虑的东西有些多,0.92至0.93,至当前(2015.3.14)的master一直在变化.在这里 ...
- c缺陷与陷阱笔记-第一章 词法陷阱
1.运算符的贪心性,匹配最长的运算符,例如 n-->0,从-开始,-是运算符,--是运算符,-->就不是,所以是 n -- > 0,--是 a---b,-是,--是,,---不是,所 ...
- android应用崩溃的调试方法(c++ lib so文件库崩溃)
android调试工具addr2line使用: 1.将ndk中的arm-linux-androideabi-addr2line可执行文件的路径加入配置文件~/.bashrc中,例如: export P ...
- jquery.dataTables插件使用例子详解
DataTables是一个jQuery的表格插件.这是一个高度灵活的工具,依据的基础逐步增强,这将增加先进的互动控制,支持任何HTML表格 效果图 代码 <!doctype html> & ...
- js监听输入框值的即时变化onpropertychange、oninput
js监听输入框值的即时变化onpropertychange.oninput 很多情况下我们都会即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感. // // 要达到的效果 ...