zoukankan      html  css  js  c++  java
  • POJ 3233 Matrix Power Series(矩阵等比求和)

    题目链接

    模板题。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <map>
    #include <algorithm>
    #include <vector>
    #include <string>
    using namespace std;
    int p[101][101],mat[101][101];
    int t;
    void qmod(int n,int MOD)
    {
        int c[101][101],i,j,k;
        while(n)
        {
            memset(c,0,sizeof(c));
            if(n&1)
            {
                memset(c,0,sizeof(c));
                for(i = 0;i < t;i ++)
                {
                    for(j = 0;j < t;j ++)
                    {
                        for(k = 0;k < t;k ++)
                        {
                            c[i][j] += mat[i][k] * p[k][j];
                            c[i][j] %= MOD;
                        }
                    }
                }
                memcpy(mat,c,sizeof(mat));
            }
            memset(c,0,sizeof(c));
            for(i = 0;i < t;i ++)
            {
                for(j = 0;j < t;j ++)
                {
                    for(k = 0;k < t;k ++)
                    {
                        c[i][j] += p[i][k] * p[k][j];
                        c[i][j] %= MOD;
                    }
                }
            }
            memcpy(p,c,sizeof(p));
            n >>= 1;
        }
    }
    int main()
    {
        int n,m,k,i,j;
        while(scanf("%d%d%d",&n,&k,&m)!=EOF)
        {
            for(i = 0;i < n;i ++)
            {
                for(j = 0;j < n;j ++)
                scanf("%d",&p[i][j]);
            }
            for(i = 0;i < n;i ++)
            {
                p[i][i+n] = p[i+n][i+n] = 1;
            }
            n <<= 1;
            for(i = 0;i < n;i ++)
            {
                for(j = 0;j < n;j ++)
                mat[i][j] = (i == j);
            }
            t = n;
            qmod(k+1,m);
            n >>= 1;
            for(i = 0;i < n;i ++)
            {
                mat[i][i+n] --;
                if(mat[i][i+n] < 0)
                mat[i][i+n] += m;
            }
            for(i = 0;i < n;i ++)
            {
                for(j = 0;j < n;j ++)
                {
                    if(j == n-1)
                    printf("%d
    ",mat[i][j+n]);
                    else
                    printf("%d ",mat[i][j+n]);
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Flash性能相关
    穿过某点绘制曲线
    oracle 动态列
    oracle 失效对象自动重新编译
    EBS 重新编译无效对象 invalid object
    oracle ebs Customer Info
    Oracle Customer Contacts Info
    Report Builder中的页码问题
    APPFND01564 ORA6502,ORA06512 in afscpcon IE 9
    EBS中发送电子邮件
  • 原文地址:https://www.cnblogs.com/naix-x/p/3713115.html
Copyright © 2011-2022 走看看