AcWing 225. 矩阵幂求和 (矩阵快速幂+分治)打卡
题目: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. 矩阵幂求和 (矩阵快速幂+分治)打卡的更多相关文章
- 【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】
目录: 1:一道简单题[树形问题](Bzoj 1827 奶牛大集会) 2:一道更简单题[矩阵乘法][快速幂] 3:最简单题[技巧] 话说这些题目的名字也是够了.... 题目: 1.一道简单题 时间1s ...
- 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)
题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...
- 乘方快速幂 OR 乘法快速幂
关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于int型,即若为__int64的时候应该怎么办,这样就 ...
- 51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂
这道题我写了两种写法 一种利用逆元 a/b%mod=a*c%mod; (c是b的逆元)易得2的逆元就是5~~~04: 一种是矩阵快速幂 利用递推式得出结论 #include<cstdio> ...
- 【矩阵乘法】【快速幂】【递推】斐波那契数列&&矩乘优化递推模板
题目大意: 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, ...
- 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 ...
- CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模
很久以前做过此类问题..就因为太久了..这题想了很久想不出..卡在推出等比的求和公式,有除法运算,无法快速幂取模... 看到了 http://blog.csdn.net/yangshuolll/art ...
- 51nod 1013 3的幂的和 - 快速幂&除法取模
题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1013 Konwledge Point: 快速幂:https:/ ...
- 51Nod 1013 3的幂的和 快速幂 | 乘法逆元 | 递归求和公式
1.乘法逆元 直接使用等比数列求和公式,注意使用乘法逆元 ---严谨,失细节毁所有 #include "bits/stdc++.h" using namespace std; #d ...
- Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)
题目链接:http://codeforces.com/problemset/problem/963/A 题目大意:就是给了你n,a,b和一段长度为k的只有'+'和‘-’字符串,保证n+1被k整除,让你 ...
随机推荐
- python中split()函数的用法
函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(lis ...
- Majordomo Info VGER.KERNEL.ORG
This is VGER.KERNEL.ORG Majordomo Info The mission of vger.kernel.org is to provide email list servi ...
- 用倍增法构造后缀数组中的SA及RANK数组
感觉后缀数组很难学的说= = 不过总算是啃下来了 首先 我们需要理解一下倍增法构造的原理 设原串的长度为n 对于每个子串 我们将它用'\0'补成长度为2^k的串(2^k-1<n<=2^k) ...
- 测开之路二十八:Flask基础之静态资源
Flask默认的存放静态资源的目录名为static 在工程下创建一个文件夹(与脚本同级) 如果想命名为其他名字,则在声明app的时候要初始化,如: 准备一张图片放在static下,返回的内容加上img ...
- 测开之路二十七:Flask基础之动态路由
参数化,用<变量名> 也可以指定变量类型 类型不对的时候会报错
- TypeError: write() argument must be str, not bytes报错
TypeError: write() argument must be str, not bytes 之前文件打开的语句是: with open('C:/result.pk','w') as fp: ...
- oracle使用时间戳
TO_DATE ( '2019-12-05 00:00:00', 'yyyy-mm-dd hh24:mi:ss' ) AS UPDATE_DATE,
- shell脚本对代码执行时间的计时
时间秒: $(date +%s) 算数表达式: $(($cost_time/60)) $(($cost_time%60)) #!/bin/bash # ccache is from epel mirr ...
- linux中的常用信号
linux中的常用信号,见如下列表: 信号名 值 标注 解释 ------------------------------------------------------------------ HU ...
- c# Winform dev控件之ChartControl
1.改变颜色 字体颜色 背景颜色 XYDiagram dia = chartControl1.Diagram as XYDiagram; dia.AxisX.Label.TextColor = Col ...