POJ 3233 矩阵运算,等比数列二分求和,矩阵

原创 2016年08月31日 00:26:51
#include"iostream"
#include"stdio.h"
#include"string.h"
using namespace std;
struct Mat{
    int res[45][45];
    Mat(){memset(res,0,sizeof(res));}
}I;
int n,m,k;
Mat mut(Mat a,Mat b) //矩阵乘法
{
    Mat c;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
    {
        for(int k=0;k<n;k++)
            c.res[i][j]+=a.res[i][k]*b.res[k][j];
        c.res[i][j]%=m;
    }
    return c;
}
Mat add(Mat a,Mat b)         //矩阵加减
{
    Mat c;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            c.res[i][j]=a.res[i][j]+b.res[i][j];
            c.res[i][j]%=m;
        }

    }
    return c;
}

Mat pow(Mat a,int cnt)
{
    Mat E=I,p=a;
    while(cnt)
    {
        if(cnt%2)           
        {
            E=mut(E,p);                    //任何矩阵 矩阵都是保持不变的
            cnt--;
        }
        cnt/=2;
        p=mut(p,p);
    }
    return E;
}

Mat sum(Mat a,int cnt)  //等比数列二分求和
{
    if(cnt==1) return a;
    Mat t=sum(a,cnt/2);
    if(cnt%2)
    {
        Mat cur=pow(a,cnt/2+1);
        t=add(t,mut(t,cur));
        t=add(cur,t);
    }
    else
    {
        Mat cur=pow(a,cnt/2);
        t=add(t,mut(t,cur));
    }
    return t;
}

void print(Mat a)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        cout<<a.res[i][j]<<" ";
        cout<<endl;
    }
}



int main()
{
    while(cin>>n>>k>>m)
    {
        Mat a;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
        {
            scanf("%d",&a.res[i][j]);
            a.res[i][j]%=m;           //一定要有
            if(i==j) I.res[i][j]=1;else I.res[i][j]=0;
        }
        Mat ans=sum(a,k);
        print(ans);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ 3233 Matrix Power Series(矩阵等比数列求和)

题意就是一个等比数列求和的意思,只不过每一项都是矩阵这里需要进行一下转移矩阵的构造,形成一个递推累加的效果:设 B = (A,I;0,I)则B^(k + 1) = (A^(k + 1),I + A +...

poj 3233 Matrix Power Series(矩阵乘法·二分等比数列)

题目:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS   Memory Limit: 13107...

poj3233 等比矩阵二分求和

题意:给定矩阵A 求A+A^2+A^3+.......+A^k 如何转化 令SUM(k)==A+A^2+A^3+.......+A^k 则SUM(k)=(1 + A^(k/2) )  ...
  • hyc10
  • hyc10
  • 2017年05月19日 21:11
  • 61

poj 3233 矩阵快速幂 + 二分求和

题意:给定n*n的矩阵和一个整数k , 要求计算 S = A + A^2 + A^2 + ... + A^k。 思路:A^i 可以通过 矩阵快速幂求得,但是由于k比较大,普通矩阵累加和会TLE,这里...

poj 3233Matrix Power Series(矩阵快速幂 二分求和 求累乘的和)

Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 20...

POJ3233 矩阵的N次幂求和 二分

k 为偶数:A^k = A ^(k/2) * A ^(k/2); k 为奇数: A^k = A ^ (k/2) * A^(k/2) * A    n  = 2k 为偶数 A^1 + ...

poj3233Matrix Power Series (等比矩阵求和)

对于整数的等比数列求和,有: 设S[n]=a+a^2+a^3+...a^n (n==0)S[n]=1 (n为偶数) S[n]=( a^(n/2)+1 )*S[n/2] (n为奇数) S[n]=( a...

poj 3233 Matrix Power Series(等比矩阵求和)

poj 3233 Matrix Power Series

HDU1588 Gauss Fibonacci (矩阵快速幂+等比数列二分求和)

Problem Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a ve...
  • jijijix
  • jijijix
  • 2016年07月21日 09:47
  • 122

poj3233矩阵快速幂运算

//此题不是求K次幂而是求累乘和,如果逐加起来复杂度变成O(N^3*K) //写出递推公式的时候矩阵是A与Sk之间的关系 #include #include using namespa...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3233 矩阵运算,等比数列二分求和,矩阵
举报原因:
原因补充:

(最多只允许输入30个字)