POJ No.3233

---恢复内容开始---

题意:已知n*n的矩阵A和正整数k,求S = A + A^2 + A^3 + .... + A^k并输出S的各元素对M取余后的答案。

分析:如果选择依次求解矩阵的幂,然后将其累加,时间复杂度是O(kn^3logk),效率太低。但如果试着找一下关于S的递推公式,效率将大大提升。

我们不妨令S(k) = I + A + A^2 + ... + A^(k-1),则有(A^k, S(k))= ((A, 0), (I, I) )* (A^(k-1), S(k-1))= ((A, 0), (I, I))^k * (I, 0)。

令矩阵B = ((A, 0), (I, I)),则原问题转化为求B^(k+1),时间复杂度为O(n^3logk)。

代码实现:

void solve(mat A, int n, int k, int M)

{

  mat B(2*n, vec(2*n));

  for(int i = 0; i < n; ++i)

    for(int j = 0; j < n; ++j)

    {

      B[i][j] = A[i][j];

      B[n+i][i] = B[n+i][n+i] = 1;//构造单位矩阵I

    }

  B = pow(B, k + 1);//求B^(k+1)

  for(int i = 0; i < n; ++i)

    for(int j = 0; j < n; ++j)

    {

      int a = (B[i + n][j]) % M;

      if(i == j)

        a = (a + M - 1) % M;

      cout << a << endl;

    }

}

---恢复内容结束---

时间: 2024-09-29 00:12:49

POJ No.3233的相关文章

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 - 矩阵快速幂

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: 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(矩阵快速幂)

题目链接:http://poj.org/problem?id=3233: 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以很显然是矩阵快速幂,但有一点,本题k的值非常大,所以要用二分求和来减少运行时间. 代码: #include <set> #include <map> #include <stack> #include <queue> #include <math.h> #include <vector> #in

矩阵十点【两】 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

题目链接:http://poj.org/problem?id=3233 思路:矩阵运算,快速幂,二分法..  妈的 b>>=1 我写成了b>>=2 wrong了一天. 真棒 如何求a+a^2+a^3+ ..... a^n = ? 用二分思想做:我们用S(n/2) =  (a+a^2+a^3+...a^n/2); 即 n为奇数时 S(n) = S(n-1) + a^n; n为偶数时候 S(n) = S(n/2) + S(n/2)*a^n/2; 知道这个就好办了~   注意细节~...

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 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 二分+矩阵乘法

链接:http://poj.org/problem?id=3233 题意:给一个N*N的矩阵(N<=30),求S = A + A^2 + A^3 + - + A^k(k<=10^9). 思路:非常明显直接用矩阵高速幂暴力求和的方法复杂度O(klogk).肯定会超时.我採用的是二分的方法, A + A^2 + A^3 + - + A^k=(1+A^(k/2)) *(A + A^2 + A^3 + - + A^(k/2)).这样就能够提出一个(1+A^(k/2)),假设k是奇数,单独处理A^k.