将$I$转置,设$G=OI$,则$ans=G^0+G^1+...+G^d$。

注意到$G^d=O(IO)^{d-1}I$,而$IO$是大小为$k\times k$的矩阵,可以通过倍增在$O(k^3\log d)$的时间内求出,然后依次与$O$和$I$的一行一列相乘即可。

时间复杂度$O(nk^2+mk^3\log d)$。

#include<cstdio>
const int N=1000,K=20,L=31,P=1000000007;
int n,m,q,i,j,k,x,y,z,ans,O[N][K],I[N][K],f[N];
int S[K][K],G[K][K],A[L][K][K],B[L][K][K],C[K][K];
inline void up(int&a,int b){a+=b;if(a>=P)a-=P;}
inline void mul(int A[][K],int B[][K]){
int i,j,k;
for(i=0;i<m;i++)for(j=0;j<m;j++){
int t=0;
for(k=0;k<m;k++)t=(1LL*A[i][k]*B[k][j]+t)%P;
C[i][j]=t;
}
}
void cal(int n){
for(i=0;i<m;i++)for(j=0;j<m;j++)S[i][j]=0;
if(n<0)return;
for(i=0;i<m;i++)for(j=0;j<m;j++)G[i][j]=0;
for(i=0;i<m;i++)S[i][i]=G[i][i]=1;
for(i=0;i<L;i++)if(n>>i&1){
for(mul(B[i],G),j=0;j<m;j++)for(k=0;k<m;k++)up(S[j][k],C[j][k]);
for(mul(G,A[i]),j=0;j<m;j++)for(k=0;k<m;k++)G[j][k]=C[j][k];
}
}
int main(){
for(scanf("%d%d",&n,&m);i<n;i++){
for(j=0;j<m;j++)scanf("%d",&O[i][j]);
for(j=0;j<m;j++)scanf("%d",&I[i][j]);
}
for(k=0;k<n;k++)for(i=0;i<m;i++)for(j=0;j<m;j++)A[0][i][j]=(1LL*I[k][i]*O[k][j]+A[0][i][j])%P;
for(i=0;i<m;i++)for(j=0;j<m;j++)B[0][i][j]=A[0][i][j];
for(i=0;i<L-1;i++){
for(mul(A[i],A[i]),j=0;j<m;j++)for(k=0;k<m;k++)A[i+1][j][k]=C[j][k];
for(j=0;j<m;j++)up(A[i][j][j],1);
for(mul(B[i],A[i]),j=0;j<m;j++)for(k=0;k<m;k++)B[i+1][j][k]=C[j][k];
for(j=0;j<m;j++)up(A[i][j][j],P-1);
}
scanf("%d",&q);
while(q--){
scanf("%d%d%d",&x,&y,&z);x--;y--;
cal(z-1);
for(i=0;i<m;i++)for(f[i]=j=0;j<m;j++)f[i]=(1LL*O[x][j]*S[j][i]+f[i])%P;
for(ans=i=0;i<m;i++)ans=(1LL*f[i]*I[y][i]+ans)%P;
printf("%d\n",(ans+(x==y))%P);
}
return 0;
}

  

BZOJ3583 : 杰杰的女性朋友的更多相关文章

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

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

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

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

  3. bzoj3583: 杰杰的女性朋友 && 4362: Graph

    Description 给出一张n个点的有向图G(V,E).对于任意两个点u,v(u可以等于v),u向v的连边数为: ∑OUT(u,i) * IN(v,i),其中1<=i<=K 其中k和数 ...

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

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

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

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

  6. cojs QAQ的矩阵 题解报告

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

  7. bzoj AC倒序

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

  8. qbxt五一数学Day1

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

  9. DOM实战

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

随机推荐

  1. hdu1212(大数取模)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1212 题意:给出两个数a, b,求a%b: 思路:(c+d)%e=c%e+d%e,(c*d)%e=(c ...

  2. 复制Informational constraints on LUW DB2 v105

    An informational constraint is a constraint attribute that can be used by the SQL compiler to improv ...

  3. CLR via C#(04)- 本是同根生

    一.等值性——Equals()方法 有时候我们需要比较两个对象是否相等,比如在一个ArrayList中进行排序查找等操作时. System.Object提供了Equals()虚方法: class Ob ...

  4. EF – 5.DbSet与DbContext,数据更新奥秘

    5.6.4 <DbSet与DbContext> 介绍DbSet与DbContext中的核心属性及重要方法. 5.6.5 <数据更新的奥秘>  这一讲极为重要,因为它揭示出了En ...

  5. Java集合源码学习(三)LinkedList分析

    前面学习了ArrayList的源码,数组是顺序存储结构,存储区间是连续的,占用内存严重,故空间复杂度很大.但数组的二分查找时间复杂度小,为O(1),数组的特点是寻址容易,插入和删除困难.今天学习另外的 ...

  6. Redis笔记(八)Redis的持久化

    Redis相比Memcached的很大一个优势是支持数据的持久化, 通常持久化的场景一个是做数据库使用,另一个是Redis在做缓存服务器时,防止缓存失效. Redis的持久化主要有快照Snapshot ...

  7. 7-13IN和NOT IN 子查询

    IN后面的子查询可以返回多条记录. SELECT ...FROM  WHERE 查询表达式 IN(子查询) 常用IN替换等于(=)的比较子查询. 用法: (1)使用 :IN关键字可以使父查询匹配子查询 ...

  8. 禁用编译器自动生成的函数(Effective C++之06)

    如果想让你的类定义出来的对象是独一无二的,即对象无法被复制,或者使用赋值操作符赋给另外一个对象,那么最好的方法就是禁用拷贝构造函数和赋值操作符.下面介绍几种禁用的方法.(方法来自Effective C ...

  9. Waiting Processed Cancelable ShowDialog (Release 2)

    namespace Test { using System; using System.Windows.Forms; static class Program { /// <summary> ...

  10. 在苹果手机上input有内阴影怎么去除

    一个input中在安卓手机上完全按照自己的样式去展示,但是在苹果手机上发现Input有内阴影,怎么去除内阴影呢? 在input样式中这样添加 #div{ .... appearance:button; ...