zoukankan      html  css  js  c++  java
  • POJ 3233 Matrix Power Series --二分求矩阵等比数列和

    题意:求S(k) = A+A^2+...+A^k.

    解法:二分即可。

    if(k为奇)  S(k) = S(k-1)+A^k

    else        S(k) = S(k/2)*(I+A^(k/2))

    代码:

    #include <iostream>
    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #define SMod m
    using namespace std;
    
    int n,m,k;
    
    struct Matrix
    {
        int m[32][32];
        Matrix()
        {
            memset(m,0,sizeof(m));
            for(int i=1;i<=n;i++)
                m[i][i] = 1;
        }
    };
    
    Matrix Mul(Matrix a,Matrix b)
    {
        Matrix res;
        int i,j,k;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                res.m[i][j] = 0;
                for(k=1;k<=n;k++)
                    res.m[i][j] = (res.m[i][j]+(a.m[i][k]*b.m[k][j])%SMod + SMod)%SMod;
            }
        }
        return res;
    }
    
    Matrix add(Matrix a,Matrix b)
    {
        Matrix res;
        memset(res.m,0,sizeof(res.m));
        int i,j;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                res.m[i][j] = (a.m[i][j]+b.m[i][j])%SMod;
        return res;
    }
    
    Matrix fastm(Matrix a,int b)
    {
        Matrix res;
        while(b)
        {
            if(b&1LL)
                res = Mul(res,a);
            a = Mul(a,a);
            b >>= 1;
        }
        return res;
    }
    
    Matrix getsum(Matrix a,int b)
    {
        Matrix A = a;
        Matrix I;
        if(b == 1)
            return A;
        if(b & 1)
            return add(getsum(a,b-1),fastm(a,b));
        else
            return Mul(getsum(a,b/2),add(I,fastm(a,b/2)));
    }
    
    int main()
    {
        int i,j;
        while(scanf("%d%d%d",&n,&k,&m)!=EOF)
        {
            Matrix ans;
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                    scanf("%d",&ans.m[i][j]);
            ans = getsum(ans,k);
            for(i=1;i<=n;i++)
            {
                printf("%d",ans.m[i][1]%m);
                for(j=2;j<=n;j++)
                    printf(" %d",ans.m[i][j]%m);
                puts("");
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    安装JDK,如何配置PATH,如何配置CLASSPATH
    存储过程笔记
    用BeanFactoryAware接口,用BEAN的名称来获取BEAN对象
    静态工厂实例代码
    setTimeout 和 setInterval 的区别
    Spring Autowire自动装配
    动态工厂模式代码实例
    JS处理回车事件
    不错的Spring学习笔记(转)
    单例模式要点
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3962150.html
Copyright © 2011-2022 走看看