首页 > 其他分享 >矩阵快速幂

矩阵快速幂

时间:2024-03-13 20:12:09浏览次数:25  
标签:return matrix int rep 矩阵 快速 define

矩阵快速幂

例题

我们线代课已经讲到矩阵了,自己也终于把之前卡了好久的矩阵快速幂的题过了ヾ(≧▽≦*)o

补充知识

矩阵矩阵乘矩阵A左乘矩阵B,记作AB;只有A的列数等于B的行数时才可相乘


P1962 斐波那契数列 - 洛谷

代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int M=1e9+7;
struct matrix{
	int c[3][3];
	matrix(){//使每次声明matrix的变量时初始化c数组 
		memset(c,0,sizeof(c));
	}
}F,A;
matrix operator*(matrix &a,matrix &b){//重载的乘法运算符*
	matrix t;
	//矩阵乘 
	rep(i,1,2){
		rep(j,1,2){
			rep(k,1,2){
				t.c[i][j]+=a.c[i][k]*b.c[k][j];
                t.c[i][j]%=M;
			}
		}
	}
	return t;
}
void qpow(int n){
	F.c[1][1]=F.c[1][2]=1;
	A.c[1][1]=A.c[1][2]=A.c[2][1]=1;
	//快速幂 
	while(n){
		if(n&1) F=F*A;
		A=A*A;
		n>>=1;
	}
}
void solve(){
	int n;cin>>n;
	if(n<=2){
		cout<<1;
		return;
	}
	qpow(n-2);//只运算n-2次 
	cout<<F.c[1][1];

}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	//int t;cin>>t;while(t--)
	solve();
	return 0;
}

P1939 矩阵加速(数列) - 洛谷

分析&代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int M=1e9+7;
struct matrix{
	int c[4][4];
	matrix(){
		memset(c,0,sizeof(c));
	}
}F,A;
matrix operator*(matrix &a,matrix &b){
	matrix t;
	rep(i,1,3){
		rep(j,1,3){
			rep(k,1,3){
				t.c[i][j]+=(a.c[i][k]%M*b.c[k][j]%M)%M;
                t.c[i][j]%=M;
			}
		}
	}
	return t;
}
void qpow(int n){
    mem(F.c),mem(A.c);
	F.c[1][1]=F.c[1][2]=F.c[1][3]=1;
	A.c[1][3]=A.c[2][1]=A.c[3][2]=A.c[3][3]=1;
	while(n){
		if(n&1) F=F*A;
		A=A*A;
		n>>=1;
	}
}
void solve(){
	int n;cin>>n;
	if(n<=3){
		cout<<1<<endl;//之前因为没换行一直wa(⊙﹏⊙)
		return;
	}
	qpow(n-1);
	cout<<F.c[1][1]<<endl;

}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t;cin>>t;while(t--)
	solve();
	return 0;
}

方程【算法赛】 - 蓝桥云课

寒假遇到的,现在学了矩阵快速幂才过……这题一共交了22次

分析

注意

  • 将答案加上模数再取模主要是用于中间结果可能溢出的情况
  • 直接对答案取模则适用于最终结果可以直接表示为ans模M的情况

代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int M=1e9+7;
int k;
struct matrix{
	int c[3][3];
	matrix(){
		memset(c,0,sizeof(c));
	}
}F,A;
matrix operator*(matrix &a,matrix &b){
	matrix t;
	rep(i,1,2){
		rep(j,1,2){
			rep(k,1,2){
				t.c[i][j]=(t.c[i][j]+a.c[i][k]*b.c[k][j]%M)%M;
			}
		}
	}
	return t;
}
void qpow(int n){
    //mem(F.c),mem(A.c);
	F.c[1][1]=2,F.c[1][2]=k;
	A.c[1][1]=0,A.c[1][2]=-1,A.c[2][1]=1,A.c[2][2]=k;
	while(n){
		if(n&1) F=F*A;
		A=A*A;
		n>>=1;
	}
}
void solve(){
	int n;cin>>n>>k;
	if(n==1){
        cout<<k;
        cout<<endl;
		return;
	}
	qpow(n-1);
	cout<<(F.c[1][2]+M)%M<<endl;//就因为这里没取模卡了快一小时

}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t;cin>>t;while(t--)
	solve();
	return 0;
}


标签:return,matrix,int,rep,矩阵,快速,define
From: https://www.cnblogs.com/mono-4/p/18057936

相关文章

  • spark大数据快速编程入门
    1.Hadoop生态圈相关组件 namenode:master节点,处理客户端的请求。datanode:slave节点,存储实际数据,汇报存储信息给namenode。client:切分文件,访问hdfs,与namenode交互,获取文件位置信息,与datanode交互,读取和写入数据。secondarynamenode:辅助namenode,分担其工作量,紧急情况下和辅......
  • 痞子衡嵌入式:使用恩智浦GUI Guider快速创建全新LCD屏示例工程的步骤
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是使用恩智浦GUIGuider快速创建全新LCD屏示例工程的步骤。在痞子衡旧文《在i.MXRT1170上快速点亮一款全新LCD屏的方法与步骤》里,痞子衡介绍了在官方SDK裸机驱动elcdif示例工程基础上做修改以支持一款......
  • 罐头鱼AI视频矩阵系统介绍|视频矩阵获客
    智能化管理,轻松批量剪辑短视频!AI系统助力您的视频营销提效!    随着短视频营销的兴起,我们推出了一款AI批量剪辑短视频系统,让视频制作更加智能高效。以下是系统的主要功能特点:首页显示:清晰展示账号登录状态、可绑定账号数量、已绑定账号情况和最近上传的视频素材,让您......
  • ThreadLocal 快速入门
    ThreadLocal快速入门ThreadLocal是Java中的一个类,用于创建线程局部变量。线程局部变量是一种特殊的变量,每个线程都有自己的副本,互相之间不会相互影响。这在多线程环境中非常有用,可以避免线程间共享变量导致的并发问题。定义与作用:ThreadLocal是Java中的一个类,用于......
  • 优秘智能开源AICMS:快速开发AIGC应用的必备,SAAS营销管理和AI的API全方位接入
    随着人工智能技术的飞速发展,AIGC(AIGeneratedContent)已经成为了当今科技领域的热门话题。为了帮助更多的企业和开发者快速开发AIGC应用,优秘智能近日开源了其强大的AICMS(AIContentManagementSystem)平台,助力开发者高效构建各类AIGC应用。一、优秘智能AICMS简介优秘智能是......
  • 毕业论文攻略:快速完成,轻松毕业!
    制定计划,合理分阶段......
  • 数据结构算法系列----快速幂
    一、快速幂的介绍:1、为什么要使用快速幂:   当我们计算a的n次幂时,最先想到的肯定是c中的内置函数  pow(a,n),这个内置函数虽然简单方便,但是在实际使用中这个函数的时间复杂度是o(n),因为它是将a乘n次得到的答案。  由于在n非常大时用pow()很容易超时,因此我们引入一个时......
  • 使用IDEA+groovy快速生成entity、dto、dao、service、serviceImpl
    groovy代码importcom.intellij.database.model.DasTableimportcom.intellij.database.util.Caseimportcom.intellij.database.util.DasUtilimportjava.text.SimpleDateFormat/**Availablecontextbindings:*SELECTIONIterable<DasObject>*PROJ......
  • 性能诊断工具DBdoctor如何快速纳管数据库PolarDB-X
    DBdoctor是一款为数据库内核级性能诊断工具,利用eBPF技术深入数据库内核,致力于解决数据库的一切性能问题。近日,DBdoctor(V3.1.0)正式通过了阿里云PolarDB分布式版(V2.3)产品集成认证测试,并获得阿里云颁发的产品生态集成认证。本文将介绍PolarDB的特性,以及如何快速纳管数据库Pola......
  • 矩阵模板("+" "-" "*")
    structmat{ intn,m; inta[maxn][maxn]; voidzero() { memset(a,0,sizeof(a)); } voidone() { zero(); for(inti=1;i<=n;i++) { a[i][i]=i; } } voidresize(intx,inty) { n=x; m=y; } matoperator+(constmat&A)const { mat......