zoukankan      html  css  js  c++  java
  • 矩阵相关

    1. 矩阵快速幂、加速数列递推与高斯消元解线性方程组

    1. 矩阵模板

    struct matrix{int n,m,a[110][110];};
    matrix input(int n,int m)//输入矩阵
    {
    	matrix A;A.n=n;A.m=m;
    	for(int i=1ll;i<=A.n;i++)
    		for(int j=1ll;j<=A.m;j++)
    			scanf("%lld",&A.a[i][j]);
    	return A;
    }
    void output(matrix A)//输出矩阵
    {
    	for(int i=1ll;i<=A.n;i++)
    	{
    		for(int j=1ll;j<=A.m;j++)printf("%lld ",A.a[i][j]);
    		printf("
    ");
    	}
    }
    void clear(matrix A)//清空矩阵
    {
    	memset(A.a,0,sizeof(A.a));
    	A.n=A.m=0;
    }
    matrix unit(int n)//矩阵单位元
    {
    	matrix A;A.n=A.m=n;
    	for(int i=1ll;i<=A.n;i++)
    		for(int j=1ll;j<=A.m;j++)
    			A.a[i][j]=(i==j);
    	return A;
    }
    matrix add(matrix A,matrix B)//矩阵加法
    {
    	matrix C;memset(C.a,0,sizeof(C.a));C.n=C.m=A.n;
    	for(int i=1ll;i<=C.n;i++)
    		for(int j=1ll;j<=C.m;j++)
    			C.a[i][j]=(A.a[i][j]+B.a[i][j])%mod;
     	return C;
    }
    matrix mul(matrix A,matrix B)//矩阵乘法
    {
    	matrix C;memset(C.a,0,sizeof(C.a));C.n=A.n;C.m=B.m;
    	for(int i=1ll;i<=C.n;i++)
    		for(int j=1ll;j<=C.m;j++)
    			for(int k=1ll;k<=A.m;k++)
    				C.a[i][j]=(((long long)A.a[i][k]*B.a[k][j])%mod+C.a[i][j])%mod;
     	return C;
    }
    matrix qpow(matrix A,int n)//矩阵快速幂
    {
    	if(n==1ll)return A;
    	matrix B=qpow(A,n/2ll);
    	B=mul(B,B);
    	if(n%2ll==1ll)B=mul(B,A);
    	return B;
    }
    

    2. 矩阵快速幂加速数列递推

    //广义斐波那契数列
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    int mod;
    struct matrix{int n,m,a[4][4];};
    matrix unit(int n)
    {
    	matrix A;A.n=A.m=n;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			A.a[i][j]=(i==j);
    	return A;
    }
    matrix mul(matrix A,matrix B)
    {
    	matrix C;memset(C.a,0,sizeof(C.a));C.n=A.n;C.m=B.m;
    	for(int i=1;i<=C.n;i++)
    		for(int j=1;j<=C.m;j++)
    			for(int k=1;k<=A.m;k++)
    				C.a[i][j]=(((long long)A.a[i][k]*B.a[k][j])%mod+C.a[i][j])%mod;
    	return C;
    }
    matrix qpow(matrix A,int n)
    {
    	if(n==1)return A;
    	matrix B=qpow(A,n/2);
    	B=mul(B,B);
    	if(n&1)B=mul(B,A);
    	return B;
    }
    matrix A,B,ans;
    int p,q,a1,a2,n,m;
    signed main()
    {
    	scanf("%d%d%d%d%d%d",&p,&q,&a1,&a2,&n,&m);
    	mod=m;
    	A.n=1;A.m=2;
    	A.a[1][1]=a1;A.a[1][2]=a2;
    	B.n=B.m=2;
    	B.a[1][1]=0;B.a[1][2]=q;
    	B.a[2][1]=1;B.a[2][2]=p;
    	if(n<=2)
    	{
    		if(n==1)printf("%d
    ",a1);
    		if(n==2)printf("%d
    ",a2);
    	}
    	else
    	{
    		ans=qpow(B,n-2);
    		ans=mul(A,ans);
    		printf("%d
    ",ans.a[1][2]);
    	}
    	return 0;
    }
    

    3. 高斯消元

  • 相关阅读:
    树莓派安装aria2轻松下载小资源
    利用树莓派3搭建可以发射无线局域网的微型服务器
    Vue语法
    redis-cluster集群
    分布式锁
    Redis--消息队列
    设计模式---享元模式
    设计模式(单例模式+原型模式)+ c#的内存分配机制
    MVC的ActionFilter
    MVC异常处理的7大场景 + MVC的异常处理的过滤器 + 全局异常
  • 原文地址:https://www.cnblogs.com/pjykk/p/14412139.html
Copyright © 2011-2022 走看看