矩阵快速幂

题目描述

矩阵乘法:

A[n*m]*B[m*k]=C[n*k];

C[i][j]=sum(A[i][1~n]+B[1~n][j])

为了便于赋值和定义,我们定义一个结构体储存矩阵:

struct Matrix{
long long m[][];
};

X*Y:

 Matrix cheng(Matrix X,Matrix Y)
{
Matrix C;
for(long long i=;i<=n;i++)
for(long long j=;j<=n;j++)
{
C.m[i][j]=;
for(long long l=;l<=n;l++)
C.m[i][j]=(C.m[i][j]+X.m[i][l]*Y.m[l][j])%MOD;
}
return C;
}

快速幂:

把k转化为二进制,

  如k=10(10)=1010(2);

  a^10=a^(2^3) * a^(2^1)=(a^8)*(a^2)

代码:

Matrix qsort(Matrix X,long long p)
{
Matrix S=E;
while(p)
{
if(p&) S=cheng(S,X);
X=cheng(X,X);
p>>=;
}
return S;
}

其中E是一个矩阵,相当于数字1,任何一个矩阵A*E=A。

当n=10时,E等于

1,0,0,0,0,0,0,0,0,0

0,1,0,0,0,0,0,0,0,0

0,0,1,0,0,0,0,0,0,0

0,0,0,1,0,0,0,0,0,0

0,0,0,0,1,0,0,0,0,0

0,0,0,0,0,1,0,0,0,0

0,0,0,0,0,0,1,0,0,0

0,0,0,0,0,0,0,1,0,0

0,0,0,0,0,0,0,0,1,0

0,0,0,0,0,0,0,0,0,1

生成矩阵E:

for(long long i=;i<=n;i++)
E.m[i][i]=;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long n,k;
const long long MOD=;
struct Matrix{
long long m[][];
};
Matrix A,E,ANS;
Matrix cheng(Matrix X,Matrix Y)
{
Matrix C;
for(long long i=;i<=n;i++)
for(long long j=;j<=n;j++)
{
C.m[i][j]=;
for(long long l=;l<=n;l++)
C.m[i][j]=(C.m[i][j]+(X.m[i][l]*Y.m[l][j]))%MOD;
}
return C;
}
Matrix qsort(Matrix X,long long p)
{
Matrix S=E;
while(p)
{
if(p&) S=cheng(S,X);
X=cheng(X,X);
p>>=;
}
return S;
}
int main()
{
scanf("%lld%lld",&n,&k);
for(long long i=;i<=n;i++)
E.m[i][i]=;
for(long long i=;i<=n;i++)
for(long long j=;j<=n;j++)
scanf("%lld",&A.m[i][j]);
ANS=qsort(A,k);
for(long long i=;i<=n;i++)
{
for(long long j=;j<=n;j++)
printf("%lld ",ANS.m[i][j]);
puts("");
}
return ;
}

【洛谷P3390】矩阵快速幂的更多相关文章

  1. P3390矩阵快速幂

    题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k ...

  2. 【luogu P3390 矩阵快速幂】 模板

    题目链接:https://www.luogu.org/problemnew/show/P3390 首先要明白矩阵乘法是什么 对于矩阵A m*p  与  B p*n 的矩阵 得到C m*n 的矩阵 矩阵 ...

  3. 【洛谷】P1229快速幂

    题目链接:https://www.luogu.org/problemnew/show/P1226 题意:求b^p % m之后的结果 题解:快速幂模板 代码: #include<iostream& ...

  4. 模板【洛谷P3390】 【模板】矩阵快速幂

    P3390 [模板]矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 矩阵A的大小为n×m,B的大小为n×k,设C=A×B 则\(C_{i,j}=\sum\limits_{k=1}^{n}A_{i, ...

  5. 洛谷P3758/BZOJ4887 [TJOI2017] 可乐 [矩阵快速幂]

    洛谷传送门,BZOJ传送门 可乐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 299  Solved: 207 Description 加里敦星球的人 ...

  6. 【模板】矩阵快速幂 洛谷P2233 [HNOI2002]公交车路线

    P2233 [HNOI2002]公交车路线 题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另 ...

  7. 3990 [模板]矩阵快速幂 洛谷luogu

    题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k ...

  8. 洛谷P1349 广义斐波那契数列(矩阵快速幂)

    P1349 广义斐波那契数列 https://www.luogu.org/problemnew/show/P1349 题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定 ...

  9. 洛谷P1962 斐波那契数列(矩阵快速幂)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

随机推荐

  1. Vue.js-----轻量高效的MVVM框架(二、Vue.js的简单入门)

    1.hello vue.js! (1)引入vue.js <script type="text/javascript" src="js/vue.js"> ...

  2. pod基本操作

    目录 创建Pod 查询Pod 删除Pod 更新Pod @(kernetes虚拟化学习)[pod基本操作] pod基本操作 ---- 创建Pod kubectl create -f test_pod.y ...

  3. pandas DataFrame数据转为list

    dfpath=df[df['mm'].str.contains('20180122\d')].values dfplist=np.array(dfpath).tolist()

  4. Murano Weekly Meeting 2016.05.24

    Meeting time: 2016.May.24 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: 1.A ...

  5. Object.create 以及 Object.setPrototypeOf

    第一部分 Object.crate() 方法是es5中的关于原型的方法, 这个方法会使用指定的原型对象以及属性去创建一个新的对象. 语法 Object.create(proto, [ properti ...

  6. 查看服务器配置信息prtdiag与systeminfo实用命令

    UNIX(SUN服务器)bash-2.05# prtdiag -v系统配置:  Sun Microsystems  sun4u Sun Fire V890系统时钟频率:150 MHz内存大小:3276 ...

  7. IA-32e架构下的内核初始化内存管理

    初级内存管理单元 关于内存的分页 以往的物理页是按照4KB进行分配和管理的, 而在Linux之后流行的就是2MB大小的物理页的分配和管理, 整个物理内存管理单元也是2MB物理页管理的 先获取基本的物理 ...

  8. HDU 5353—— Average——————【贪心+枚举】

    Average Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  9. 用户“Michael-PC\Michael”不具有所需的权限。请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题。

    解决方法:在注册表增加键值 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System] 新建-选择“D ...

  10. mysql中count(*)和found_rows()的区别

    count(*)和found_rows()都可以用来求查询记录的数量 而count(*)往往单独使用,found_rows()却可以跟上前面一个查询,即select * from table limi ...