首页 > 其他分享 >矩阵

矩阵

时间:2023-04-15 09:12:59浏览次数:24  
标签:Hash matrix int 矩阵 const include

1.矩阵快速幂

struct matrix{ll mat[N][N];}a;
matrix operator *(const matrix &a,const matrix &b){
	matrix c;
	memset(c.mat,0,sizeof(c.mat));
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			for(int k=0;k<N;k++){
				c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%MOD;
			}
		}
	}
	return c;
}
matrix quickPow(matrix a,ll n){
	matrix ans;
	memset(ans.mat,0,sizeof(ans.mat));
	for(int i=0;i<N;i++)ans.mat[i][i]=1;
	while(n){
		if(n&1)ans=ans*a;
		a=a*a;
		n>>=1;
	}
	return ans;
}

  

2.矩阵快速幂加速递推

例题:poj3070

求Fn,n<=2^63

去求矩阵的幂

最终左下角的数就是Fn

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int MOD = 1e4;
struct matrix{long long m[3][3];};
matrix mul(matrix a,matrix b,int n){
	matrix C;
	memset(C.m,0,sizeof(C.m));
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			int r=a.m[i][k];
			for(int j=1;j<=n;j++){
				C.m[i][j]+=r*b.m[k][j];
				C.m[i][j]%=MOD;
			}
		}
	}
	return C;
} 
matrix quickPow(matrix A,int n,int k){
	matrix C;
	memset(C.m,0,sizeof(C.m));
	for(int i=1;i<=n;i++)C.m[i][i]=1;
	while(k){
		if(k&1)C=mul(C,A,2);
		A=mul(A,A,2);
		k>>=1;
	}
	return C;
}
int main(){
	long long n;
	while(cin>>n&&~n){
		matrix A;
		if(n==0||n==1||n==2){
			printf("%d\n",n==0?0:1);
			continue;
		}
		A.m[1][1]=0;
		A.m[1][2]=A.m[2][1]=A.m[2][2]=1;
		A=quickPow(A,2,n-1);
		cout<<A.m[2][2]<<'\n';
	}
	return 0;
}

  

3.矩阵乘法和路径问题

例题:poj3613

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 120,INF = 0x3f;
int Hash[N*10],cnt=0;
struct matrix{int m[N][N];};
matrix operator *(const matrix& a,const matrix& b){
	matrix c;memset(c.m,INF,sizeof(c.m));
	for(int i=1;i<=cnt;i++){
		for(int j=1;j<=cnt;j++){
			for(int k=1;k<=cnt;k++){
				c.m[i][j]=min(c.m[i][j],a.m[i][k]+b.m[k][j]);
			}
		}
	}
	return c;
}
matrix quickPow(matrix a,int n){
	matrix ans=a;
	--n;
	while(n){
		if(n&1)ans=ans*a;
		a=a*a;
		n>>=1;
	}
	return ans;
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int n,t,s,e;cin>>n>>t>>s>>e;
	matrix a;memset(a.m,INF,sizeof(a.m));
	while(t--){
		int u,v,w;cin>>w>>u>>v;
		if(!Hash[u])Hash[u]=++cnt;
		if(!Hash[v])Hash[v]=++cnt;
		a.m[Hash[u]][Hash[v]]=a.m[Hash[v]][Hash[u]]=w;
	}
	matrix ans=quickPow(a,n);
	cout<<ans.m[Hash[s]][Hash[e]];
	return 0;
}

 

标签:Hash,matrix,int,矩阵,const,include
From: https://www.cnblogs.com/zhanghx-blogs/p/17320491.html

相关文章

  • c语言实现矩阵相乘
    一、问题描述。用动态二维数组的知识进行矩阵相乘。二、设计思路。1、申请两个动态二维数组。2、输入两个矩阵的行数和列数。3、如果满足前一个矩阵的列数等于第二个矩阵的行数,就让前一个矩阵的x行的第y个元素乘以后一个矩阵的x列的第y的元素。4、以矩阵的形式输出。三、程......
  • Android兼容性矩阵
    起因新上的设备,发现hal不支持,因此记录下,下图已经是修复了正常的了36的对应的native函数是android_location_GnssLocationProvider_is_supported,这一看就是hal没有staticjbooleanandroid_location_GnssLocationProvider_is_supported(JNIEnv*/*env*/,jclas......
  • AutoCAD.NET:矩阵和变换–矩阵信息
      [CommandMethod("Matrix_PrintOut")]publicstaticvoidMatrix_PrintOut(){Editored=MgdAcApplication.DocumentManager.MdiActiveDocument.Editor;Databasedb=HostApplicationServices.WorkingDatabase;try{Matrix3didentityM......
  • codeforces #185 A Plant(矩阵快速幂+递推)
    题目地址:http://codeforces.com/problemset/problem/185/A通过这个题终于找回了点找递推公式的信心。。TAT。。不过真心感觉CF的题目质量都真不错。。。首先,第n个图形的上方,左下方,右下方的三个大三角形是跟第n-1个是一模一样的,所以是3*f(n-1)。然后只剩下中间一个倒着的大三角形了,......
  • HDU 2842 Chinese Rings(矩阵快速幂+递推)
    题目地址:HDU2842这个游戏是一个九连环的游戏。假设当前要卸下前n个环。由于要满足前n-2个都卸下,所以要先把前n-2个卸下,需要f(n-2)次。然后把第n个卸下需要1次,然后这时候要卸下第n-1个,然后此时前n-2个都已经被卸下了。这时候把前n-2个都卸下与都装上所需的次数是一样的,因为卸下与装......
  • R语言对称矩阵提取上三角/下三角矩阵?
    目标输入矩阵col.1col.2col.3col.4row.11234row.25678row.39101112row.413141516输出矩阵col.1col.2col.3col.4row.11234row.2067......
  • HDU 2604 Queuing(矩阵快速幂)
    题目地址:HDU2604这题只要推出公式来,构造矩阵就很容易了,问题是推不出公式来。。TAT。。从递推的思路考虑,用f(n)表示n个人满足条件的结果,如果最后一个是m则前n-1人可以任意排列,有f(n-1)种;如果是f,则考虑后两位mf和ff,没有一定满足或者一定不满足的状态,所以继续考虑一位,考虑后三位......
  • HDU 1588 Gauss Fibonacci(矩阵快速幂)
    题目地址:HDU1588用于构造斐波那契的矩阵为1,11,0设这个矩阵为A。sum=f(b)+f(k+b)+f(2*k+b)+f(3*k+b)+........+f((n-1)*k+b)<=>sum=A^b+A^(k+b)+A^(2*k+b)+A^(3*k+b)+........+A^((n-1)*k+b)<=>sum=A^b+A^b*(A^k+A^2*k+A^3*k+.......+A^((n-1)*k))(1)设矩阵B为A^k;那么(1......
  • HDU 3306 Another kind of Fibonacci(矩阵快速幂)
    题目地址:HDU3306没什么智商的题目,只要把构造矩阵硬算出来就行。代码如下:#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<stdlib.h>#include<math.h>#include<ctype.h>#include<queue>#include<......
  • 负荷需求响应matlab 考虑电价需求弹性系数矩阵的负荷需求响应
    负荷需求响应matlab考虑电价需求弹性系数矩阵的负荷需求响应,采用matlab进行编程,通过价格需求矩阵确定峰谷平负荷调节量,实现了理想的削峰填谷,程序运行可靠,有详实的参考资料。YID:9550676854173285......