poj3233—Matrix Power Series

题目链接:http://poj.org/problem?id=3233

题目意思:给一个矩阵n*n的矩阵A和一个k,求一个式子 S = A + A2 + A3 + … + Ak。

这个需要用到等比数列和的二分加速。

当n为奇数的时候,Sn=Sn-1+A^k;

当n为偶数的时候,Sn=(S[n/2]+E)*A^(k/2)

自己xjb推一下就知道等比数列和的二分加速是咋回事了。我举个例子,我们假设求等比数列2,4,8,16,32,64的和s=(8+1)*(2+4+8),而2+4+8=(2+4)+8,而(2+4)=(2+1)*2,其他的可以一次类推。

这个过程我们可以直接用一个递归过程算出来,其余我们套用矩阵快速幂的模板就好了。

代码:

 1 //Author: xiaowuga
 2 #include<iostream>
 3 #include<cstring>
 4 #define maxx INT_MAX
 5 #define minn INT_MIN
 6 #define inf 0x3f3f3f3f
 7 #define size 35
 8 using namespace std;
 9 typedef long long ll;
10 int n,k,mod;
11 struct Mat{
12     int mat[size][size];
13     void clear(){
14         memset(mat,0,sizeof(mat));
15     }
16
17     Mat operator *(const Mat &e) const{
18         Mat tmp;
19         tmp.clear();
20         for(int k=0;k<n;k++)
21             for(int i=0;i<n;i++){
22                 if(mat[i][k]==0) continue;
23                 for(int j=0;j<n;j++){
24                    if(e.mat[k][j]==0) continue;
25                     tmp.mat[i][j]+=mat[i][k]*e.mat[k][j]%mod;
26                     tmp.mat[i][j]%=mod;
27                 }
28             }
29         return tmp;
30     }
31     Mat operator +(const Mat &e) const{
32         Mat tmp;
33         tmp.clear();
34             for(int i=0;i<n;i++){
35                 for(int j=0;j<n;j++){
36                     tmp.mat[i][j]=(mat[i][j]%mod+e.mat[i][j]%mod)%mod;
37                 }
38             }
39         return tmp;
40     }
41 };
42 Mat m,E;
43 Mat pow(Mat ma,ll num){
44     Mat ans;
45     ans.clear();
46     for(int i=0;i<n;i++) ans.mat[i][i]=1;
47     while(num){
48         if(num&1) ans=ans*ma;
49         num/=2;
50         ma=ma*ma;
51     }
52     return ans;
53 }
54 Mat fun(int x){
55     if(x==1) return m;
56     if(x&1) return fun(x-1)+pow(m,x);
57     else return (pow(m,x/2)+E)*fun(x/2);
58 }
59 int main() {
60     ios::sync_with_stdio(false);cin.tie(0);
61     cin>>n>>k>>mod;
62     E.clear();
63     for(int i=0;i<n;i++) E.mat[i][i]=1;
64     for(int i=0;i<n;i++)
65         for(int j=0;j<n;j++) cin>>m.mat[i][j];
66     Mat ans=fun(k);
67     for(int i=0;i<n;i++){
68         for(int j=0;j<n;j++)
69             cout<<ans.mat[i][j]<<" ";
70         cout<<endl;
71     }
72     return 0;
73 }

时间: 2024-10-06 04:55:17

poj3233—Matrix Power Series的相关文章

POJ3233 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

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 题目大意: 给定一个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

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

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(矩阵+二分)

题目大意:求由矩阵 A构成的矩阵 S = A + A^2 + A^3 + - + A^k.k的取值范围是:10^9数据很大,应该二分. 对于一个k来说,s(k) = (1+A^(k/2)) *( A+A^2+--+A^(k/2)).如果k为奇数的话需要加上A^(k/2 + 1). 所以二分求和,复杂度就降下来了,当然还得用到矩阵快速幂. Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions

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

线性代数(矩阵乘法):POJ 3233 Matrix Power Series

Matrix Power Series 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) a