首页 > 其他 > 详细

zoj 2853 Evolution 矩阵快速幂

时间:2015-05-08 22:11:27      阅读:270      评论:0      收藏:0      [点我收藏+]

在我的电脑上code::blocks运行过不了,但代码是可以AC的,很是郁闷。

问了大神,知道了函数的参数是放在栈区,结构体太大的话,栈就爆了,如是后来就听从大神的意见用引用改写了。

传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1853

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int Len_Matrix;
int Mod;
double value[205];

struct Matrix{
    double M[205][205];
};

void Init_Matrix(Matrix & tmp){
    for(int i=0;i<Len_Matrix;i++){
        for(int j=0;j<Len_Matrix;j++){
            if(i==j) tmp.M[i][j] = 1;
            else tmp.M[i][j] = 0;
        } 
    }
}

void Debug_Matrix(Matrix & tmp){
    for(int i=0;i<Len_Matrix;i++){
        for(int j=0;j<Len_Matrix;j++){
            printf("%lf ",tmp.M[i][j]);
        }
        puts("");
    }
}

void multiply(Matrix & a1,Matrix & a2,Matrix & ans){
    for(int i=0;i<Len_Matrix;i++){
        for(int j=0;j<Len_Matrix;j++){
            ans.M[i][j] = 0;
            for(int k=0;k<Len_Matrix;k++){
               ans.M[i][j] += a1.M[i][k]*a2.M[k][j]; 
            }
        }
    }
}

void Pow(Matrix & tmp,int nl,Matrix &ans){
    Init_Matrix(ans);
    Matrix temp1,temp2;
    while(nl){
        if(nl&1){
            temp1 = ans;
            multiply(temp1,tmp,ans);
        }
        temp1 = tmp;
        temp2 = tmp;
        multiply(temp1,temp2,tmp);
        nl /= 2;
    }
}

void Solve(Matrix & tmp,int m){
    Matrix ans;
    Pow(tmp,m,ans);
    double zans = 0;
    for(int i=0;i<Len_Matrix;i++){
        zans += ans.M[i][Len_Matrix-1] * value[i];
    }
    printf("%.0lf\n",zans);
}

void Input(){
    int n,m;
    while(scanf("%d %d",&n,&m),n+m){
        Matrix tmp;
        Len_Matrix = n;
        Init_Matrix(tmp);
        for(int i=0;i<n;i++){
            scanf("%lf",value+i);
        }
        int k;
        scanf("%d",&k);
        int tempi,tempj;
        double temprate;
        for(int i=0;i<k;i++){
            scanf("%d %d %lf",&tempi,&tempj,&temprate);
            tmp.M[tempi][tempj] += temprate;
            tmp.M[tempi][tempi] -= temprate;
        }
        Solve(tmp,m);
    }
}

void File(){
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
}

int main(void){
    //File();
    Input();
    return 0;
}


zoj 2853 Evolution 矩阵快速幂

原文:http://blog.csdn.net/nmfloat/article/details/45583871

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!