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整除,让你 ...
随机推荐
- LUOGU P3759 [TJOI2017]不勤劳的图书管理员(树套树)
传送门 解题思路 和以前做过的一道题有点像,就是区间逆序对之类的问题,用的是\(BIT\)套权值线段树,交换时讨论一下计算答案..跑的不如暴力快.. 代码 #include<iostream&g ...
- linux设备驱动第三篇:写一个简单的字符设备驱动
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分 ...
- vijos 1054 牛场围栏 【想法题】
这题刚看完后第一个想到的方法是背包 但仔细分析数据范围后会发现这题用背包做复杂度很高 比如对于这样的数据 2 100 2999 2898 (如果有神犇可以用背包过掉这样的数据 请回复下背包的做法) - ...
- Hive date_trunc函数
The function date_trunc is conceptually similar to the trunc function for numbers. date_trunc('field ...
- leetcode-解题记录 557. 反转字符串中的单词 III
题目: 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" 输出 ...
- Cocos2d Box2D之浮动刚体
| 版权声明:本文为博主原创文章,未经博主允许不得转载. b2_kinematicBody 运动学物体在模拟环境中根据自身的速度进行移动.运动学物体自身不受力的作用.虽然用户可以手动移动它,但是通 ...
- 转 Xshell ssh长时间连接不掉线设置
1.Xshell客户端设置 2.服务器设置 vi /etc/ssh/sshd_config 把ClientAliveInterval 0和ClientAliveCountMax 3前的井号去掉,并把C ...
- 转 mysql 远程连接数据库的二种方法
mysql 远程连接数据库的二种方法 一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5.116),端口“3306”,用户名为“root”,密码“123456” ...
- Spring Boot 如何防止重复提交?
Java技术栈 www.javastack.cn 优秀的Java技术公众号 在传统的web项目中,防止重复提交,通常做法是:后端生成一个唯一的提交令牌(uuid),并存储在服务端.页面提交请求携带这个 ...
- 前端学习(三十)es6的一些问题(笔记)
赋值表达式 document.onclick = document.onmouseover = fn; var a = b = c = d = 5; 不推荐 逗号表 ...