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 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 lines each containing n nonnegative
integers below 32,768, giving A’s elements in row-major order.

Output

Output the elements of S modulo m in the same way as A is given.

Sample Input

2 2 4
0 1
1 1

Sample Output

1 2
2 3

题意:给定矩阵A,求A + A^2 + A^3 + … + A^k的结果(两个矩阵相加就是对应位置分别相加)。输出的数据mod m。

思路:这是一道典型的矩阵快速幂的问题。用到两次二分,相当经典。矩阵快速幂。首先我们知道 A^x 可以用矩阵快速幂求出来。其次可以对k进行二分,每次将规模减半,分k为奇偶两种情况,如当k = 10和k = 5时有:

k = 10 有: S(10) = ( A^1+A^2+A^3+A^4+ A^5 ) + A^5 * ( A^1+A^2+A^3+A^4+A^5 ) = S(5) + A^5 * S(5)

k = 5 有: S(5) = ( A^1+A^2 ) + A^3 + A^3 * ( A^1+A^2 ) = S(2) +
A^3 + A^3 * S(2)

k = 2 有 :  S(2) = A^1 + A^2 = S(1) + A^1 * S(1)。

应用这个式子后,规模k减小了一半。我们二分求出后再递归地计算,即可得到原问题的答案。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
using namespace std;
const int inf=0x3f3f3f3f;
int n,mod;
struct node
{
    int mp[50][50];
}init,res;
struct node Mult(struct node x,struct node y)
{
    struct node tmp;
    int i,j,k;
    for(i=0;i<n;i++)
    for(j=0;j <n;j++){
        tmp.mp[i][j]=0;
        for(k=0;k<n;k++){
            tmp.mp[i][j]=(tmp.mp[i][j]+x.mp[i][k]*y.mp[k][j])%mod;
        }
    }
    return tmp;
};
struct node expo(struct node x,int k)
{
    struct node tmp;
    int i,j;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++){
        if(i==j)
            tmp.mp[i][j]=1;
        else
            tmp.mp[i][j]=0;
    }
    while(k){
        if(k&1) tmp=Mult(tmp,x);
        x=Mult(x,x);
        k>>=1;
    }
    return tmp;
};
struct node add(struct node x,struct node y)
{
    struct node tmp;
    int i,j;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++){
        tmp.mp[i][j]=(x.mp[i][j]+y.mp[i][j])%mod;
    }
    return tmp;
};
struct node sum(struct node x,int k)
{
    struct node tmp,y;
    if(k==1) return x;
    tmp=sum(x,k/2);
    if(k&1){
        y=expo(x,k/2+1);
        tmp=add(Mult(y,tmp),tmp);
        return add(tmp,y);
    }
    else{
        y=expo(x,k/2);
        return add(Mult(y,tmp),tmp);
    }
};
int main()
{
    int m,k,i,j,x;
    scanf("%d %d %d",&n,&k,&mod);
    for(i=0;i<n;i++)
    for(j=0;j<n;j++){
        scanf("%d",&x);
        init.mp[i][j]=x%mod;
    }
    res=sum(init,k);
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            if(j==n-1)
                printf("%d\n",res.mp[i][j]);
            else
                printf("%d ",res.mp[i][j]);
        }
    }
    return 0;
}
时间: 2024-10-04 05:32:29

POJ 3233-Matrix Power Series(矩阵快速幂+二分求矩阵和)的相关文章

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

题目: Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2858    Accepted Submission(s): 1186 Problem Description Without expecting, Angel replied quickly.She says: "I'v heard that y

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

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

题目链接:http://poj.org/problem?id=3233 解题报告:输入一个边长为n的矩阵A,然后输入一个k,要你求A + A^2 + A^3 + A^4 + A^5.......A^k,然后结果的每个元素A[i][j] % m.(n <= 30,k < 10^9,m < 10^4) 要用到矩阵快速幂,但我认为最重要的其实还是相加的那个过程,因为k的范围是10^9,一个一个加肯定是不行的,我想了一个办法就是我以k = 8为例说明: ans = A + A^2 + A^3 +

矩阵十点【两】 poj 1575 Tr A poj 3233 Matrix Power Series

poj 1575  Tr A 主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575 题目大意:A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. 数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据.接下来有n行,每行有n个数据,每一个数据的范围是[0,9].表示方阵A的内容. 一个矩阵高速幂的裸题. 题解: #

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

http://poj.org/problem?id=3233 ps转: 用二分方法求等比数列前n项和:即 原理: (1)若n==0 (2)若n%2==0     (3)若n%2==1 代码如下: LL sum(LL p,LL n) { if(n==0) return 1; if(n&1) return (1+pow(p,(n>>1)+1))*sum(p,n>>1); else return (1+pow(p,(n>>1)+1))*sum(p,(n-1)>&

POJ 3233 Matrix Power Series

矩阵快速幂+二分求前n项和 矩阵快速幂是有模板的,多做几道题就会理解,前提是要会快速幂取模: 之所以用二分是因为求和的过程:A^1+A^2...+A^(k-1)+A^k,   k是1e9的,所以暴力求和肯定会TLE,在网上找到 了二分求矩阵和的方法: 公式为  (1+A^(k/2))*(A+A^2+..+A^k/2)   的,所以可以写成二分递归,如果k为奇数的话,sum就加上A^k(k为当 前的k值,不再是最初的值),反正是个公式,你要不信的话可以证明一下,所以就贴代码了,感觉到姿势不够优美

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

Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very clever boy. So if you wanna me be your GF, you should solve the problem called GF~. " How good an opportunity that Gardon can not give up! The "Prob

POJ 3233 Matrix Power Series 【经典矩阵快速幂+二分】

任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 28619   Accepted: 11646 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. Input The

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

Default Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 15553 Accepted: 6658 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