zoukankan      html  css  js  c++  java
  • 洛谷P3390——矩阵快速幂 题解

    如果你打开这篇博客,那么我就默认你已经学会了二维矩阵。

    (关于矩阵的介绍我会再抽出一篇博客来讲)

    那么既然大家已经会了矩阵和二维矩阵的相乘那么我就直接搬运AC代码了!

    在看代码之前我们先关注几个点:

    1.关于矩阵的乘法我们最好直接使用重载运算符的方法,这样的话可以使得代码的可读性变得很高并且使得代码十分简洁。

    2.千万千万要注意数据范围(这道题的数据范围在longlong范围内所以一定要注意审题)

    #include<bits/stdc++.h>
    #define esp 1000000007
    #define int long long
    using namespace std;
    struct matry{
    	int w[101][101]={{0,0}};
    	int rows=0,columns=0;//行数和列数 
    	friend matry operator * (matry x,matry y){
    		matry z;
    		memset(z.w,0,sizeof(z.w));
    		z.rows=x.rows;
    		z.columns=y.columns;
    		if(x.columns!=y.rows){
    			return z;
    		}
    		else{
    			for(int i=1;i<=x.rows;i++){
    				for(int j=1;j<=y.columns;j++){
    					for(int k=1;k<=x.columns;k++){
    						z.w[i][j]+=(x.w[i][k]*y.w[k][j]);
    						z.w[i][j]%=esp;
    					}
    				}
    			}
    		}
    		return z;
    	}
    }a;
    int n,k;
    matry mksm(matry x,int y){
    	matry z;
    	memset(z.w,0,sizeof(z.w));
    	if(y==1) return x;
    	z=mksm(x,y/2);
    	z=z*z;
    	if(y&1){
    		 return x*z;
    	}
    	else{
    		return z;
    	}
    }
    signed main(){
    	scanf("%lld%lld",&n,&k);
    	a.rows=n;
    	a.columns=n;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			scanf("%lld",&a.w[i][j]);
    		}
    	}
    	matry q=mksm(a,k);
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			printf("%lld ",q.w[i][j]);
    		}
    		puts("");
    	}
    	return 0;
    }
    

    End.

  • 相关阅读:
    vxlan 内核实现
    perf 系统调用
    quic NAT
    机器学习在ABR算法中的应用纵览
    清华最新AIOps案例:强化学习,降低网络传输延时
    内核gso
    怎么提高网络应用性能?让DPDK GRO和GSO来帮你!
    网卡VXLAN的offload技术介绍
    Matplotlib中的plt和ax画图的区别
    Task 3: 异常处理(2天)
  • 原文地址:https://www.cnblogs.com/robertspot/p/12540729.html
Copyright © 2011-2022 走看看