Description

给出一张n个点的有向图G(V,E)。对于任意两个点u,v(u可以等于v),u向v的连边数为:
∑OUT(u,i) * IN(v,i),其中1<=i<=K
其中k和数组out,in均已知,现在给出m个询问,每次询问给出三个参数u,v,d,你需要回答从节点
u出发,经过不超过d条边到达节点v的路径有多少种。答案模10^9+7。
 

Input

第一行两个整数n,k。
接下来n行,第i行有2k个整数,前k个整数描述outi,后k个数描述ini。
接下来一行一个整数m。
接下来m行,每行三个整数u,v,d(0<=d<2^31),描述一组询问。
 

Output

对于每个询问,输出一行一个整数,描述答案。
 

Sample Input

5 2
2 5 4 3
7 9 2 4
0 1 5 2
6 3 9 2
2147483647 1000000001 233522 788488
10
1 1 0
2 2 1
2 4 5
4 3 10
3 4 50
1 5 1000

Sample Output

1
51
170107227
271772358
34562176
890241289

HINT

1<=N<=1000
1<=K<=20
1<=M<=50
 
题解:
将in转置一下
设G[u][v]=u到v直接的路径条数,显然g=out*in
然后答案矩阵显然是Gd
但G是1000*1000的矩阵,直接写一定会T
注意到Gd=(out*in)d=out*(in*out)d-1*in
而in*out是20*20的矩阵
然后求答案时并不用把Gd求出来,我们只需要u到v的路径数,不然复杂度还是过不去
注意常数(卡蠢我了)
code:
 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cassert>
#include<cstring>
#include<algorithm>
#define maxn 21
#define mod 1000000007
using namespace std;
char ch;
bool ok;
void read(int &x){
for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
int n,m,q,a,b,d;
int out[][maxn],in[maxn][],list[maxn],ans;
struct Matrix{
int v[maxn][maxn];
void init(int op){
for (int i=;i<=m;i++) for (int j=;j<=m;j++) v[i][j]=(i==j)*op;
}
}base,I,emp,tmp,res,sum,last;
Matrix operator+(const Matrix &a,const Matrix &b){
static Matrix c;
c=emp;
for (int i=;i<=m;i++) for (int j=;j<=m;j++) c.v[i][j]=(a.v[i][j]+b.v[i][j])%mod;
return c;
}
Matrix operator*(const Matrix &a,const Matrix &b){
static Matrix c;
c=emp;
for (int i=;i<=m;i++) for (int j=;j<=m;j++) for (int k=;k<=m;k++)
c.v[i][k]=(c.v[i][k]+1LL*a.v[i][j]*b.v[j][k])%mod;
return c;
}
void solve(int n){//1+a+a^2+a^3+...+a^n
if (n<){res=emp;return;}
Matrix a=base,b=a,v=I,s=I;
for(int i=n;i;i>>=,b=b*(a+I),a=a*a)
if(i&) s=s+b*v,v=v*a;
res=s;
}
int main(){
read(n),read(m),I.init(),emp.init();
for (int i=;i<=n;i++){
for (int j=;j<=m;j++) read(out[i][j]);
for (int j=;j<=m;j++) read(in[j][i]);
}
for (int i=;i<=m;i++) for (int j=;j<=m;j++) base.v[i][j]=;
for (int i=;i<=m;i++) for (int j=;j<=n;j++) for (int k=;k<=m;k++)
base.v[i][k]=(base.v[i][k]+1LL*in[i][j]*out[j][k])%mod;
read(q);
while (q--){
read(a),read(b),read(d);
solve(d-);
for (int i=;i<=m;i++) list[i]=;
for (int i=;i<=m;i++) for (int j=;j<=m;j++) list[j]=(list[j]+1LL*out[a][i]*res.v[i][j])%mod;
ans=;
for (int i=;i<=m;i++) ans=(ans+1LL*list[i]*in[i][b])%mod;
printf("%d\n",ans+(a==b));
}
return ;
}

bzoj3583: 杰杰的女性朋友 && 4362: Graph的更多相关文章

  1. bzoj3583 杰杰的女性朋友 || bzoj4362 Graph

    http://210.33.19.103/problem/2174 很显然是矩阵快速幂的题,设有in和ou矩阵,设in矩阵的转置为in' 显然可以直接暴力求出任意两点间走一步路径条数,然后求其d次幂, ...

  2. [BZOJ3583]杰杰的女性朋友(矩阵快速幂)

    杰杰的女性朋友 时间限制:10s      空间限制:256MB 题目描述 杰杰是魔法界的一名传奇人物.他对魔法具有深刻的洞察力,惊人的领悟力,以及令人叹为观止的创造力.自从他从事魔法竞赛以来,短短几 ...

  3. BZOJ3583 杰杰的女性朋友 矩阵

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3583.html 题目传送门 - BZOJ3583 题意 有一个 $n$ 个点构成的有向图. 对于每一个 ...

  4. 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 ...

  5. 复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期) _复旦大学、女性课程、高级研修班、心理学、EWP_培训通课程

    复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期) _复旦大学.女性课程.高级研修班.心理学.EWP_培训通课程 复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期)    学      ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. cojs QAQ的矩阵 题解报告

    题目描述非常的清晰 首先我们考虑(A*B)^m的求法,这个部分可以参考BZOJ 杰杰的女性朋友 我们不难发现(A*B)^m=A*(B*A)^(m-1)*B A*B是n*n的矩阵,而B*A是k*k的矩阵 ...

  8. qbxt五一数学Day1

    目录 I. 基础知识 1. 带余除法(小学) 1. 定义 2. 性质 2. 最大公约数(gcd)/ 最小公倍数(lcm) 1. 定义 2. 性质 3. 高精度 II. 矩阵及其应用 1. 定义 2. ...

  9. DOM实战

    作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正 视频来源:https://www.bil ...

随机推荐

  1. 352. Data Stream as Disjoint Intervals

    Plz take my miserable life T T. 和57 insert interval一样的,只不过insert好多. 可以直接用57的做法一个一个加,然后如果数据大的话,要用tree ...

  2. AFNetworking2.0 NSHipster翻译

    AFNetworking 是当前 iOS 和 Mac OS X 开发中最广泛使用的开源项目之一.它帮助了成千上万叫好又叫座的应用,也为其它出色的开源库提供了基础.这个项目是社区里最活跃.最有影响力的项 ...

  3. winform 加密 解密 分类: WinForm 2014-05-16 15:05 400人阅读 评论(0) 收藏

    界面显示: 加密: 解密: 代码实现: public string EncryptString(string str)         {             #region 加密程序       ...

  4. string字符串转成16进制

    package util; public class EscapeUnescape { public static String escape(String src) { int i; char j; ...

  5. Java 执行jar linux 实例

    需求:通过执行jar的方式 ,把某个文件路径下的用户数据同步到redis 1.main 函数 public class Main { private static Logger logger = Lo ...

  6. Linux进程通信之System V共享内存

    前面已经介绍过了POSIX共享内存区,System V共享内存区在概念上类似POSIX共享内存区,POSIX共享内存区的使用是调用shm_open创建共享内存区后调用mmap进行内存区的映射,而Sys ...

  7. 数学之路-分布式计算-disco(4)

    第一个參数iter是一个迭代器,涉及被map函数产生的键和值.它们是reduce实例. 在本例中.单词随机被托付给不同的reduce实例.然后,要单词同样,处理它的reduce也同样.可确保终于合计是 ...

  8. TCP 函数

    [root@localhost tt]# man listen LISTEN() Linux Programmer’s Manual LISTEN() NAME listen - listen for ...

  9. windows10UWP:如何在xaml中设置控件为 public ?

    windows10UWP中,由于使用页面导航,操作在不同一个页面的控件需求经常遇到. 如果要对另一个page里面的控件进行操作,那么这个控件必须设置为 public .在 xaml 设置控件的方法是: ...

  10. 11.1 morning

    完美的序列(sequence)Time Limit:1000ms Memory Limit:64MB题目描述LYK 认为一个完美的序列要满足这样的条件:对于任意两个位置上的数都不相同.然而并不是所有的 ...