hdoj 3521 An easy Problem(矩阵乘法)

来源:互联网 发布:mac没有flash怎么办 编辑:程序博客网 时间:2024/05/20 12:48

【题目大意】:

其中A是给定矩阵,I是单位矩阵。


【解题思路】:直接暴力做吧...


【代码】:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>#include <cmath>#include <string>#include <cctype>#include <map>#include <iomanip>                   using namespace std;                   #define eps 1e-8#define pi acos(-1.0)#define inf 1<<30#define linf 1LL<<60#define pb push_back#define lc(x) (x << 1)#define rc(x) (x << 1 | 1)#define lowbit(x) (x & (-x))#define ll long longstruct Mart{    double mat[105][105];};Mart a,ans1,ans;int n;double k;Mart mart_multiply(Mart a,Mart b){    Mart c;    for(int i=1; i<=n; i++)        for(int j=1; j<=n; j++){            c.mat[i][j]=0;            for(int k=1; k<=n; k++)                c.mat[i][j]=c.mat[i][j]+a.mat[i][k]*b.mat[k][j];        }    return c;}void copy(Mart p){    for (int i=1; i<=n; i++)        for (int j=1; j<=n; j++)            a.mat[i][j]=p.mat[i][j];}void solve_mart_power(int np){    Mart p,q;    for(int i=1; i<=n; i++)        for(int j=1; j<=n; j++){            p.mat[i][j]=ans1.mat[i][j];            if(i==j)  q.mat[i][j]=1.0;            else  q.mat[i][j]=0.0;        }    if(np==0) copy(q);    else {        while(np!=1){            if(np&1){                np--;                q=mart_multiply(p,q);            }            else{                np=np/2;                p=mart_multiply(p,p);            }        }        p=mart_multiply(p,q);        copy(p);    }    return ;}int main(){    while (~scanf("%d",&n)){        if(n==0)            break;        for (int i=1; i<=n; i++)            for (int j=1; j<=n; j++){                scanf("%lf",&a.mat[i][j]);                ans1.mat[i][j]=a.mat[i][j];                ans.mat[i][j]=0;            }        k=1;        for (int i=1; i<=50; i++){            solve_mart_power(i-1);            if (i!=1)  k=k*((i-1)*1.0);            for (int j=1; j<=n; j++){                for (int l=1; l<=n; l++){                    ans.mat[j][l]=ans.mat[j][l]+a.mat[j][l]/k;                                   }            }        }        for (int i=1; i<=n; i++){            for (int j=1; j<=n; j++)                printf("%.2f ",ans.mat[i][j]);            printf("\n");        }    }    return 0;}