BZOJ3583 杰杰的女性朋友 矩阵
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3583.html
题目传送门 - BZOJ3583
题意
有一个 $n$ 个点构成的有向图。
对于每一个点 $i$ ,给定两组参数,每组参数分别有 $k$ 个值。这两组参数分别记做: $in[i][1\cdots k],out[i][1\cdots k]$ 。
从点 $i$ 连到点 $j$ 的边数定义为 $\sum_{t=1}^k in[i][t]\times out[i][t]$ 。
$m$ 组询问,每次询问从 点 $x$ 走到点 $y$ ,经过不超过 $d$ 条边的方案总数。
$n\leq 1000,m\leq 50,k\leq 20,d\leq 2^{31}-1$
题解
首先我们选取 $k$ 个中介点,很容易得到一个由原图的 $n$ 个点转移到这 $k$ 个点的方案数的转移矩阵 $\mathbf O$;类似的,可以得一个由 $k$ 个中介点转移到原图的 $n$ 个点的方案数的转移矩阵 $\mathbf I$ 。
假设我们要求的是恰好经过 $d$ 条路径的方案数,那么,显然,我们只需要求出 $(\mathbf{OI})^d$ 的第 $i$ 行第 $j$ 列的值即可。
但是我们发现这个矩阵是 $1000\times 1000$ 的,复杂度显然不行。我们发现 $k$ 非常小,而且矩阵 $\mathbf {IO}$ 的长宽都是 $k$ 。
由于矩阵乘法具有结合律,所以我们可以把原式写成:
$\mathbf{O} (\mathbf{IO})^d \mathbf{I}$ 这样时间复杂度就对了。
但是原题要求的是不超过 $d$ 步的。
考虑新增一个点,这个点只能走到自己,将询问中的终点连向它即可。
代码
#pragma GCC optimize("O2")
#include <bits/stdc++.h>
using namespace std;
const int N=1005,K=25,mod=1e9+7;
struct Mat{
int r,c;
vector <vector <int> > v;
Mat(){}
Mat(int _r,int _c,int x){
r=_r,c=_c;
vector <int> vec;
vec.clear();
for (int i=0;i<=c;i++)
vec.push_back(0);
v.clear();
for (int i=0;i<=r;i++)
v.push_back(vec);
if (r==c)
for (int i=0;i<=r;i++)
v[i][i]=x;
}
void Print(){
for (int i=0;i<=r;i++,puts(""))
for (int j=0;j<=c;j++)
printf("%3d ",v[i][j]);
puts("");
}
};
Mat operator * (Mat A,Mat B){
Mat C(A.r,B.c,0);
if (A.c!=B.r)
return C;
for (int i=0;i<=A.r;i++)
for (int j=0;j<=B.c;j++)
for (int k=0;k<=A.c;k++)
C.v[i][j]=(1LL*A.v[i][k]*B.v[k][j]+C.v[i][j])%mod;
return C;
}
Mat Pow(Mat x,int y){
Mat ans(x.r,x.c,1);
for (;y;y>>=1,x=x*x)
if (y&1)
ans=ans*x;
return ans;
}
int read(){
int x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
int n,m,k;
Mat I,O,M,res;
int main(){
n=read(),k=read();
O=Mat(n,k,0);
I=Mat(k,n,0);
for (int i=1;i<=n;i++){
for (int j=1;j<=k;j++)
O.v[i][j]=read();
for (int j=1;j<=k;j++)
I.v[j][i]=read();
}
I.v[0][0]=O.v[0][0]=1;
m=read();
while (m--){
int x=read(),y=read(),d=read();
O.v[y][0]=1;
res=O*Pow(I*O,d);
int ans=0;
for (int i=0;i<=k;i++)
ans=(1LL*res.v[x][i]*I.v[i][0]+ans)%mod;
printf("%d\n",ans);
O.v[y][0]=0;
}
return 0;
}
BZOJ3583 杰杰的女性朋友 矩阵的更多相关文章
- [BZOJ3583]杰杰的女性朋友(矩阵快速幂)
杰杰的女性朋友 时间限制:10s 空间限制:256MB 题目描述 杰杰是魔法界的一名传奇人物.他对魔法具有深刻的洞察力,惊人的领悟力,以及令人叹为观止的创造力.自从他从事魔法竞赛以来,短短几 ...
- BZOJ3583 : 杰杰的女性朋友
将$I$转置,设$G=OI$,则$ans=G^0+G^1+...+G^d$. 注意到$G^d=O(IO)^{d-1}I$,而$IO$是大小为$k\times k$的矩阵,可以通过倍增在$O(k^3\l ...
- bzoj3583: 杰杰的女性朋友 && 4362: Graph
Description 给出一张n个点的有向图G(V,E).对于任意两个点u,v(u可以等于v),u向v的连边数为: ∑OUT(u,i) * IN(v,i),其中1<=i<=K 其中k和数 ...
- bzoj3583 杰杰的女性朋友 || bzoj4362 Graph
http://210.33.19.103/problem/2174 很显然是矩阵快速幂的题,设有in和ou矩阵,设in矩阵的转置为in' 显然可以直接暴力求出任意两点间走一步路径条数,然后求其d次幂, ...
- cojs QAQ的矩阵 题解报告
题目描述非常的清晰 首先我们考虑(A*B)^m的求法,这个部分可以参考BZOJ 杰杰的女性朋友 我们不难发现(A*B)^m=A*(B*A)^(m-1)*B A*B是n*n的矩阵,而B*A是k*k的矩阵 ...
- 复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期) _复旦大学、女性课程、高级研修班、心理学、EWP_培训通课程
复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期) _复旦大学.女性课程.高级研修班.心理学.EWP_培训通课程 复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期) 学 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- qbxt五一数学Day1
目录 I. 基础知识 1. 带余除法(小学) 1. 定义 2. 性质 2. 最大公约数(gcd)/ 最小公倍数(lcm) 1. 定义 2. 性质 3. 高精度 II. 矩阵及其应用 1. 定义 2. ...
- DOM实战
作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正 视频来源:https://www.bil ...
随机推荐
- MVC异步方法
在mvc的开发过程中,有时候我们会需要在action中调用异步方法,这个时候会需要做一些特殊处理.我们会使用到await和async.对应的controller也应该是async的. 在MVC4中直接 ...
- (一)七种AOP实现方法
在这里列表了我想到的在你的应用程序中加入AOP支持的所有方法.这里最主要的焦点是拦截,因为一旦有了拦截其它的事情都是细节. Approach 方法 Advantages 优点 Disadvantage ...
- Maven安装与配置及使用
下载及安装 官方下载地址:直达官网下载页面 进入下载页面后,根据你电脑所装jdk版本选择对应版本的maven进行下载. 我们可以看到该页上边红框内写明了,maven3.3版以上支持的是JDK1.7+的 ...
- 解决访问swaggerUI接口文档显示basic-error-controler问题
问题描述 使用swagger生成接口文档后,访问http://localhost:8888/swagger-ui.html#/,显示如下: 有些强迫症的我,感觉看起来很不舒服,结果百度了好久,找到解决 ...
- 数据库入门-基本sql语句及数据类型
一.基本sql语句 SQL语言主要用于存取数据.查询数据.更新数据和管理关系数据库系统,SQL语言由IBM开发.SQL语言分为3种类型: #.DDL语句 数据库定义语言: 数据库.表.视图.索引.存储 ...
- Redis Lua脚本调试
从版本3.2开始,Redis包含一个完整的Lua调试器,可以用来使编写复杂Redis脚本的任务更加简单. 由于Redis 3.2仍处于测试阶段,请unstable从Github 下载Redis 的分支 ...
- oracle 的sqlplus 工具进行翻译的rlwrap 安装教程
一:下载地址: 链接: https://share.weiyun.com/50R5pBb (密码:dQPc) 或者该QQ群下载: 二:该工具的安装步骤: [oracle@localhost ~]$ l ...
- SpringMvc + Jsp+ 富文本 kindeditor 进行 图片ftp上传nginx服务器 实现
一:html 原生态的附件上传 二:实现逻辑分析: 1.1.1 需求分析 Common.js 1.绑定事件 2.初始化参数 3.上传图片的url: /pic/upload 4.上图片参数名称: upl ...
- Django框架之第二篇
一.知识点回顾 1.MTV模型 model:模型,和数据库相关的 template:模板,存放html文件,模板语法(目的是将变量如何巧妙的嵌入到HTML页面中). views:视图函数 另加urls ...
- python(10): xlsxwriter模块
import xlsxwriter as writer 注意: xlsxwriter 只能创建新文件,不可以修改原有文件.如果创建新文件时与原有文件同名,则会覆盖原有文件. import xlsxwr ...