POJ3233 Matrix Power Series【矩阵快速幂】

题目链接:

http://poj.org/problem?id=3233

题目大意:

给定一个N*N的矩阵A和一个整数K,要求计算S = A + A^2 + A^3 + … + A^k。

思路:

分别用矩阵快速幂求出每一项的A^i,然后将每一项矩阵相加,考虑到k值很大,所有采用

二分求解。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 110;

struct Matrax
{
    int m[MAXN][MAXN];
}a,per;

int N,M;

void Init()
{
    for(int i = 0; i < N; ++i)
        for(int j = 0; j < N; ++j)
        {
            scanf("%d",&a.m[i][j]);
            a.m[i][j] %= M;
            per.m[i][j] = (i == j);
        }
}

Matrax Add(Matrax a,Matrax b)
{
    Matrax c;
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < N; ++j)
        {
            c.m[i][j] =  (a.m[i][j] + b.m[i][j]) % M;
        }
    }

    return c;
}

Matrax Multi(Matrax a,Matrax b)
{
    Matrax c;
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < N; ++j)
        {
            c.m[i][j] = 0;
            for(int k = 0; k < N; ++k)
            {
                c.m[i][j] += a.m[i][k] * b.m[k][j];
            }
            c.m[i][j] %= M;
        }
    }

    return c;
}

Matrax Power(int k)
{
    Matrax p,ans = per;
    p = a;
    while(k)
    {
        if(k&1)
        {
            ans = Multi(ans,p);
            k--;
        }
        else
        {
            k >>= 1;
            p = Multi(p,p);
        }
    }
    return ans;
}

Matrax MatraxSum(int k)
{
    if(k == 1)
        return a;
    Matrax temp,b;
    temp = MatraxSum(k/2);
    if(k&1)
    {
        b = Power(k/2+1);
        temp = Add(temp,Multi(temp,b));
        temp = Add(temp,b);
    }
    else
    {
        b = Power(k/2);
        temp = Add(temp,Multi(temp,b));
    }
    return temp;
}

int main()
{
    int k;
    while(~scanf("%d%d%d",&N,&k,&M))
    {
        Init();
        Matrax ans = MatraxSum(k);
        for(int i = 0; i < N; ++i)
        {
            for(int j = 0; j < N-1; ++j)
            {
                printf("%d ",ans.m[i][j]);
            }
            printf("%d\n",ans.m[i][N-1]);
        }
    }

    return 0;
}
时间: 2024-11-07 15:12:50

POJ3233 Matrix Power Series【矩阵快速幂】的相关文章

POJ3233:Matrix Power Series(矩阵快速幂+二分)

http://poj.org/problem?id=3233 题目大意:给定矩阵A,求A + A^2 + A^3 + … + A^k的结果(两个矩阵相加就是对应位置分别相加).输出的数据mod m.k<=10^9.这道题两次二分,相当经典.首先我们知道,A^i可以二分求出.然后我们需要对整个题目的数据规模k进行二分.比如,当k=6时,有:A + A^2 + A^3 + A^4 + A^5 + A^6 =(A + A^2 + A^3) + A^3*(A + A^2 + A^3)应用这个式子后,规模

poj3233 Matrix Power Series 矩阵快速幂

题目链接: http://poj.org/problem?id=3233 题意: 给你A矩阵,A矩阵是n*n的一个矩阵,现在要你求S = A + A^2 + A^3 + - + A^k.那么s一定也是一个N*N的矩阵,最后要你输出s,并且s的每一个元素对m取余数 思路: 令Sk-1=I+A+A^2+.....+A^(k-1) 则Sk=I+A+A^2+.....+A^k+A^k 所以 Sk=Sk-1+A^k 答案就是 mat[i+n][j] 代码: 1 #include <iostream> 2

POJ 3233 - Matrix Power Series ( 矩阵快速幂 + 二分)

POJ 3233 - Matrix Power Series ( 矩阵快速幂 + 二分) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; #define MAX_SIZE 30 #define CLR( a, b ) memset( a, b, sizeof(a) ) int MOD = 0; int n, k; st

Matrix Power Series(矩阵快速幂)

矩阵快速幂:http://www.cnblogs.com/kuangbin/archive/2012/08/17/2643347.html Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 16341   Accepted: 6966 Description Given a n × n matrix A and a positive integer k, find the sum S

POJ 3233 Matrix Power Series (矩阵快速幂+二分)

Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 16403   Accepted: 6980 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. Input The input contains exactly one test cas

POJ 3233 Matrix Power Series 矩阵快速幂+二分求和

矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+Ak/2+A(k/2)*(A+A2+...+Ak/2)    k为偶数时: sum=A+A2+...+A(k-1)/2+A((k-1)/2)*(A+A2+...+A(k-1)/2)+Ak    k为奇数时. 然后递归二分求和 PS:刚开始mat定义的是__int64,于是贡献了n次TLE... #i

poj 3233 Matrix Power Series - 矩阵快速幂

Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak. Input The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n li

POJ 3233-Matrix Power Series(矩阵快速幂+二分求矩阵和)

Matrix Power Series Time Limit:3000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3233 Appoint description:  System Crawler  (2015-02-28) Description Given a n × n matrix A and a positive integer k, find the

poj3233Matrix Power Series(矩阵快速幂,两种写法)

Matrix Power Series Time Limit:3000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. Input The input contains exactly one t

HDU 4965 Fast Matrix Calculation(矩阵快速幂)

HDU 4965 Fast Matrix Calculation 题目链接 矩阵相乘为AxBxAxB...乘nn次,可以变成Ax(BxAxBxA...)xB,中间乘n n - 1次,这样中间的矩阵一个只有6x6,就可以用矩阵快速幂搞了 代码: #include <cstdio> #include <cstring> const int N = 1005; const int M = 10; int n, m; int A[N][M], B[M][N], C[M][M], CC[N]