题目:https://www.acwing.com/problem/content/227/

题意:给你n,k,m,然后输入一个n阶矩阵A,让你求  S=A+A^2+A^3.+......+A^k

思路:首先因为A是矩阵,我们k的范围很大,那么很明显看出A^k可以用矩阵快速幂来计算,但是这样我们只能算出其中一项,还是有k项,那么我们怎么计算和呢

我们可以看出前一项和后一项是有关联的,就是乘了一个A,我们怎么利用前面计算的结果呢,On遍历肯定不行,既然我们用到了遍历,那么优化我们很容易想到二分

假设我们    A+A^2+A^3+A^4+A^5+A^6

那么可以利用类似分治的方法,一直这样二分递归下去,然后我们自底向上,以左子树推出又子树,这样就能得到最终的答案

#include<bits/stdc++.h>
using namespace std;
#define MAXN 35
typedef long long ll;
int n,mod;
struct mat
{
ll m[MAXN][MAXN];//矩阵结构体
}unit;//unit为单位矩阵,即主对角线全部为1,这样任何矩阵与单位矩阵相乘都为它本身 mat msub(mat a,mat b)//矩阵相乘函数
{
mat ret;
ll x;
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
x=;
for(int k=;k<n;k++)
{
x+=((a.m[i][k]*b.m[k][j])%mod);//取余
}
ret.m[i][j]=x%mod;//取余
}
}
return ret;
}
mat add(mat a,mat b)//矩阵相乘函数
{
mat ret;
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
ret.m[i][j]=(a.m[i][j]+b.m[i][j])%mod;
}
}
return ret;
} void init_unit()//初始化单位矩阵
{
for(int i=;i<MAXN;i++)
{
unit.m[i][i]=;
}
} mat qpow(mat a,ll x)//快速幂
{
mat ans=unit;
while(x)
{
if(x&) ans=msub(ans,a);
a=msub(a,a);
x>>=;
}
return ans;
} mat sum(mat a,ll k){
if(k==) return a;
mat w=sum(a,k/);
if(k%){
mat ans=qpow(a,k/+);
ans=add(ans,msub(ans,w));
return add(w,ans);
}
else{
mat ans=qpow(a,k/);
return add(w,msub(ans,w));
}
}
int main()
{
ll x;
init_unit();
cin>>n>>x>>mod;
mat a,ans;
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
cin>>a.m[i][j];
}
}
ans=sum(a,x);
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
if(j!=n-) cout<<ans.m[i][j]<<" ";
else cout<<ans.m[i][j]<<endl;
}
}
return ;
}

AcWing 225. 矩阵幂求和 (矩阵快速幂+分治)打卡的更多相关文章

  1. 【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】

    目录: 1:一道简单题[树形问题](Bzoj 1827 奶牛大集会) 2:一道更简单题[矩阵乘法][快速幂] 3:最简单题[技巧] 话说这些题目的名字也是够了.... 题目: 1.一道简单题 时间1s ...

  2. 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)

    题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...

  3. 乘方快速幂 OR 乘法快速幂

    关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于int型,即若为__int64的时候应该怎么办,这样就 ...

  4. 51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂

    这道题我写了两种写法 一种利用逆元 a/b%mod=a*c%mod; (c是b的逆元)易得2的逆元就是5~~~04: 一种是矩阵快速幂 利用递推式得出结论 #include<cstdio> ...

  5. 【矩阵乘法】【快速幂】【递推】斐波那契数列&&矩乘优化递推模板

    题目大意: F[0]=0 F[1]=1 F[n+2]=F[n+1]+F[n] 求F[n] mod 104. F[n+2] F[n+1] = 1 1 1 0 * F[n+1] F[n] 记这个矩阵为A, ...

  6. Educational Codeforces Round 13——D. Iterated Linear Function(矩阵快速幂或普通快速幂水题)

      D. Iterated Linear Function time limit per test 1 second memory limit per test 256 megabytes input ...

  7. CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模

    很久以前做过此类问题..就因为太久了..这题想了很久想不出..卡在推出等比的求和公式,有除法运算,无法快速幂取模... 看到了 http://blog.csdn.net/yangshuolll/art ...

  8. 51nod 1013 3的幂的和 - 快速幂&除法取模

    题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1013 Konwledge Point: 快速幂:https:/ ...

  9. 51Nod 1013 3的幂的和 快速幂 | 乘法逆元 | 递归求和公式

    1.乘法逆元 直接使用等比数列求和公式,注意使用乘法逆元 ---严谨,失细节毁所有 #include "bits/stdc++.h" using namespace std; #d ...

  10. Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)

    题目链接:http://codeforces.com/problemset/problem/963/A 题目大意:就是给了你n,a,b和一段长度为k的只有'+'和‘-’字符串,保证n+1被k整除,让你 ...

随机推荐

  1. 540D - Bad Luck Island(概率DP)

    原题链接:http://codeforces.com/problemset/problem/540/D 题意:给你石头.剪刀.布的数量,它们之间的石头能干掉剪刀,剪刀能干掉布,布能干掉石头,问最后石头 ...

  2. AcWing 244. 谜一样的牛 (树状数组+二分)打卡

    题目:https://www.acwing.com/problem/content/245/ 题意:有n只牛,现在他们按一种顺序排好,现在知道每只牛前面有几只牛比自己低,牛的身高是1-n,现在求每只牛 ...

  3. src,href 和rel的区别

    src用于替换当前元素,值一般是引用的文件的绝对路径或者相对路径 href 属性的值可以是任何有效文档的相对或绝对URL,包括片段标识符和JavaScript代码段 rel REL属性用于定义链接的文 ...

  4. hbase之RPC详解

    Hbase的RPC主要由HBaseRPC.RpcEngine.HBaseClient.HBaseServer.VersionedProtocol 5个概念组成. 1.HBaseRPC是hbase RP ...

  5. 刚安装的程序要卸载,如何Ubuntu查看程序安装记录

    如果新装一个程序,突然发现需要卸载,又忘记了程序名字,怎么解决呢? /var/log/apt/history.log /var/log/apt/term.log /var/log/aptitude 看 ...

  6. CSS div内放长英文字母或长数字自动换行 CSS一行排不下自动打断换行

    添加css  word-wrap:break-word 解释:使用break-word时,是将强制换行. 兼容各版本IE浏览器,兼容谷歌浏览器.

  7. Codeforces 488D Strip (set+DP)

    D. Strip time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  8. rabbitmq-5-案例2-简单的案例+exchange

    Exchange交换机: sendMessage端,发送消息到Exchage1.2, 然后交换机通过路由键,将消息转发给队列queue中,最后客户端从队列中获取消息 交换属性: name:名称 typ ...

  9. k8s的存储卷

    存储卷查看:kubectl explain pods.spec.volumes 一.简单的存储方式 1)2个容器之间共享存储..(删除则数据消失) apiVersion: v1 kind: Pod m ...

  10. webpack4入门到进阶案例实战课程

    愿景:"让编程不在难学,让技术与生活更加有趣" 更多教程请访问xdclass.net 第一章 webpack4前言 第一集 webpack4入门到进阶案例实战课程介绍 简介:讲述w ...