首页 > 其他分享 >巨大的矩阵(矩阵加速)

巨大的矩阵(矩阵加速)

时间:2024-08-16 21:49:09浏览次数:16  
标签:int 超级计算机 矩阵 巨大 处理 init lld% 加速

https://www.luogu.com.cn/problem/P1397 第2题     巨大的矩阵 查看测评数据信息

超级计算机计算效率非常快,小明购买了一台超级计算机,用超级计算机生成一个巨大的矩阵A,矩阵A有n行m列的矩阵。A[i][j]表示矩阵A第i行第j列的元素,超级计算机生成矩阵A满足如下性质:A[1][1]=1,

A[i][j]=a*A[i][j-1]+b  (j!=1),

A[i][1]=c*A[i-1][m]+d (i!=1)。

其中a,b,c,d都是常数。超级计算机计算出的A[n][m]的值是多少?,结果可能很大,对1000000007取模。

输入格式

 

第一行六个整数n,m,a,b,c,d

1<=n,m,a,b,c,d<=1e9

 

输出格式

 

一个整数,对1000000007取模

 

输入/输出例子1

输入:

3 4 1 3 2 6

 

输出:

85

 

样例解释

 

image.png

 

 

1.对于有规律性的矩阵处理(这个分析到后面才能慢慢发现规律),考虑分段处理

2.第一次看题就是看是否是一次性无法处理的矩阵,如果一次性无法很好处理,也考虑分段处理

由于题目有两个递推式子,且是相互关联的,一个矩阵没法很好解决。我们分开处理两个矩阵。分个段处理

对于列:f(i, j)=a*f(i, j-1)+b
我们已知肯定有j-1,但是单凭这一个条件不够推,+b没法满足,所以补一个1
[f(i, j-1), 1] * [ A ] = [f[i, j], 1]

 

所以可以推出A矩阵

[a, 0]

[b, 1]

 

对于行:f(i, 1)=c*f(i-1, m)+d
跟列一样,补一个1
[f(i-1, m), 1] * [ B ] = [f[i, 1], 1]

可以推出B矩阵

[c, 0]

[d, 1]

 

分别处理完之后,我们可以处理每一行的值分别是多少,并发现这其实是一个规律!

第一行+第二行第一个数 A^(m-1) · B
第二行+第三行第一个数 A^(m-1) · B
.......
第n行+第n+1行第一个数 A^(m-1) · B

那不就出来了吗,我们对这个式子进行快速幂即可,注意是n-1次,然后再乘A矩阵,因为直接乘n次算的是第n+1行第一个数的值

 

答案:
(A^(m-1)·B ) ^ (n-1) * A^(m-1)


对于这题,我们最后发现是有规律性的,所以我们分了两段,分段处理

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=105, Mod=1000000007;

struct mp
{
	int n, m;
	int a[N][N];
	
	void init(int row, int col, bool isI)
	{
		n=row, m=col;
		memset(a, 0, sizeof a);
		
		if (isI)
			for (int i=1; i<=row; i++) a[i][i]=1;
	}	
}A, B, C;
mp operator * (const mp A, const mp B)
{
	mp C;
	C.init(A.n, B.m, 0);
	for (int i=1; i<=A.n; i++)
		for (int j=1; j<=B.m; j++)
			for (int k=1; k<=A.m; k++)
				C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%Mod;
		
	return C;
}
mp qpow_mp(mp A, int k)
{
	mp res;
	res.init(A.n, A.m, 1);
	while (k>0)
	{
		if (k&1) res=res*A;
		A=A*A;
		k>>=1;
	}
	
	return res;
}
int n, m, a, b, c, d;
signed main()
{
	scanf("%lld%lld%lld%lld%lld%lld", &n, &m, &a, &b, &c, &d);
	A.init(1, 2, 0);
	A.a[1][1]=1, A.a[1][2]=1;
	
	B.init(2, 2, 0);
	B.a[1][1]=a, B.a[1][2]=0;
	B.a[2][1]=b, B.a[2][2]=1;
	
	C.init(2, 2, 0);
	C.a[1][1]=c, C.a[1][2]=0;
	C.a[2][1]=d, C.a[2][2]=1;

	A=A*qpow_mp(qpow_mp(B, m-1)*C, n-1)*qpow_mp(B, m-1);
	printf("%lld", A.a[1][1]);
	return 0;
}

  

 

标签:int,超级计算机,矩阵,巨大,处理,init,lld%,加速
From: https://www.cnblogs.com/didiao233/p/18363698

相关文章

  • Ubuntu22.04 安装及卸载 Docker --需自行找加速站
    Ubuntu22.04DockerEngine的安装及卸载如果没有合适的docker镜像加速站,本文就不太重要了。当前时间2024.8.16参照Docker官网描述的Ubuntu安装方式。文中所有shell均来自官网,并进行了本地化修改。当前操作适用于:UbuntuNoble24.04(LTS)UbuntuJammy22.04(LTS)......
  • Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI
    Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程XorbitsInference(Xinference)是一个开源平台,用于简化各种AI模型的运行和集成。借助Xinference,您可以使用任何开源LLM、嵌入模型和多模态模型在云端或本地环境中运行推理,并......
  • SMCA:港中文提出注意力图校准的DETR加速方案 | ICCV 2021
    为了加速DETR收敛,论文提出了简单而有效的SpatiallyModulatedCo-Attention(SMCA)机制,通过在初始边界框位置给予较高的协同注意力响应值的约束来构建DETR的回归感知协同注意力。此外,将SMCA扩展为多头注意力和尺度选择注意力后,对比DETR可以实现更好的性能(108周期45.6mAPvs500周期......
  • 最新小红书矩阵批量起号玩全自动图文法,无脑操作轻松引流创业粉
    项目介绍:很多人对于引流觉得很难每天都在网上找各种各样的教程那么今天流量终结者来了小红书图文矩阵批量制作软件加小红书号商+流量回收渠道全都给你带来了这套玩法是我们一直以来自己使用的玩法相对其他引流方法这个是上量最快的也是玩法最简单的,这个软件可以给大家......
  • 最新小红书矩阵批量起号玩全自动图文法,无脑操作轻松引流创业粉
    项目介绍:很多人对于引流觉得很难每天都在网上找各种各样的教程那么今天流量终结者来了小红书图文矩阵批量制作软件加小红书号商+流量回收渠道全都给你带来了这套玩法是我们一直以来自己使用的玩法相对其他引流方法这个是上量最快的也是玩法最简单的,这个软件可以给大家......
  • 最新小红书矩阵批量起号玩全自动图文法,无脑操作轻松引流创业粉
    项目介绍:很多人对于引流觉得很难每天都在网上找各种各样的教程那么今天流量终结者来了小红书图文矩阵批量制作软件加小红书号商+流量回收渠道全都给你带来了这套玩法是我们一直以来自己使用的玩法相对其他引流方法这个是上量最快的也是玩法最简单的,这个软件可以给大家......
  • 力扣第五十九题——螺旋矩阵II
    内容介绍给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 nxn 正方形矩阵 matrix 。示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]]示例2:输入:n=1输出:[[1]]提示:1<=n<=20完整代码classSolution{publi......
  • C语言-使用数组法,指针法实现将一个5X5的矩阵中最大的元素放在中心,四个角分别放四个最
    1.题目要求:将一个5X5的矩阵中最大的元素放在中心·,四个角分别放四个最小的元素(顺序为从左到右,从上到下,从小到大存放),写一函数实现之。2.数组法实现#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>//一、数组法实现intmain(){ intarr[5][5]={ {1,2,3,4,5},......
  • 【代码随想录】一、数组:5.螺旋矩阵
    本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。1.题目1:59.螺旋矩阵II1.1.解法1:模拟本题的重点还是像之前的“704.二分查找”,坚持循环不变量原则,即在本题中遍历每条边时,坚持相同的原则。如下是一个示例,即n=5,我们考虑根据圈数和边数来进行遍历:由外圈到内......
  • 【OpenCV教程】OpenCV中对矩阵的常用操作
    @目录1.全零矩阵2.全一矩阵3.单位矩阵4.矩阵转置5.求逆矩阵6.逗号式分隔创建矩阵7.矩阵定义(只列出常用的)7.1数据类型Scalar8.通过ptr与at函数遍历矩阵8.1Vec类型9.通过迭代器遍历矩阵(easybutveryveryslow)1.全零矩阵CV_NODISCARD_STDstaticMatExprMat::zeros(intr......