HDU - 3521 An easy Problem(矩阵快速幂)

http://acm.hdu.edu.cn/showproblem.php?pid=3521

题意

对于矩阵A,求e^A的值。

分析

这个定眼一看好像很熟悉,就是泰勒展开,可惜自己的高数已经还给老师了。。。比赛时不敢直接暴力写,实际上循环到一定次数,余式对结果的影响就相当小了。循环到50几次就可以了

#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0)

using namespace std;
typedef long long ll;
template <class T>
void test(T a){cout<<a<<endl;}
template <class T,class T2>
void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
const int N = 1e6+10;
//const int MAXN = 210;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = 1000000007;
int T;
void testcase(){
    printf("Case #%d: ",++T);
}
const int MAXN = 105;
const int MAXM = 30;

struct matrix{
    double ma[MAXN][MAXN];
}x,y,temp;

int n;
matrix multi(matrix a,matrix b){
    matrix c;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            c.ma[i][j]=0;
            for(int k=1;k<=n;k++){
                c.ma[i][j]+=a.ma[i][k]*b.ma[k][j];

            }
        }
    }
    return c;
}

double P[55];
void init(){
    P[0]=1.0;
    for(int i=1;i<55;i++){
        P[i]=i*P[i-1];
    }
}
void power(int exp){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            temp.ma[i][j]=0;
            y.ma[i][j]=x.ma[i][j];
        }
        temp.ma[i][i]=1;
    }
    while(exp){
        if(exp&1){
            temp=multi(temp,y);
        }
        exp>>=1;
        y=multi(y,y);
    }
}
int main() {
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif // LOCAL
    matrix ans;
    init();
    while(~scd(n)&&n){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                scanf("%lf",&x.ma[i][j]);
                ans.ma[i][j]=0;
            }
        }
        for(int i=0;i<55;i++){
            power(i);
            for(int j=1;j<=n;j++){
                for(int k=1;k<=n;k++){
                    ans.ma[j][k]+=(temp.ma[j][k]/P[i]);
                }
            }
        }

        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                printf("%.2f ",ans.ma[i][j]);
            }
            puts("");
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/fht-litost/p/9281389.html