Just Pour the Water ZOJ - 2974 Matrix Fast Powers

Ideas:

Use the first row of an N*N matrix to record the amount of water.

Another way of matrix record transfer is not very well described, see the code for details.

When k is 0, the amount of water is given to itself.

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n;
const int N = 25;
struct Matrix {
    double m[N][N];
    Matrix(){};
    Matrix operator*(Matrix const &a) const {
        Matrix res;
        memset( res.m,0,sizeof res.m ) ;
        for ( int i=0; i<n; i++ ) {
            for ( int j=0; j<n; j++ ) {
                for (int k=0;k<n;k++ ) {
                    res.m[i][j] += this->m[i][k]*a.m[k][j];
                }
            }
        }
        return res;
    }
};
Matrix res;
void pow_mod( Matrix base ,int n ) {

    while ( n>0 ) {
        if ( n&1 ) res = res*base;
        base = base*base;
        n>>=1;
    }
}
intmain()
{
    int T;
    cin>>T;
    while ( T-- ) {
        scanf("%d",&n);
        memset( res.m,0,sizeof res.m );
        for ( int i=0; i<n; i++ )
            scanf("%lf",&res.m[0][i]);
        int k;
        Matrix base;
        memset( base.m,0,sizeof base.m );
        for ( int i=0; i<n; i++ ) {
            scanf("%d",&k);
            if ( k==0 ) {
                base.m[i][i] = 1;
                continue;
            }
            for ( int j=0; j<k; j++ ) {
                int num;
                scanf("%d",&num);
                base.m[i][num-1] = 1.0/k;
            }
        }
        int time;
        scanf("%d",&time);
        pow_mod( base,time ) ;
        for ( int i=0; i<n; i++ )
            if ( i==n-1 ) printf("%.2f\n",res.m[0][i]);
            else printf("%.2f ",res.m[0][i]);
    }


    return 0;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324652273&siteId=291194637