poj 3233(矩阵快速幂)
Posted leader_win
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 3233(矩阵快速幂)相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=3233;
题意:给出一个公式求这个式子模m的解;
分析:本题就是给的矩阵,所以很显然是矩阵快速幂,但有一点,本题k的值非常大,所以要用二分求和来减少运行时间。
代码:
#include <set> #include <map> #include <stack> #include <queue> #include <math.h> #include <vector> #include <string> #include <utility> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <functional> using namespace std; struct Matrax{ long long m[50][50]; }ter; int n,m; Matrax add(Matrax a,Matrax b){ Matrax p; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ p.m[i][j]=a.m[i][j]+b.m[i][j]; p.m[i][j]%=m; // cout<<p.m[i][j]<<" "; } // cout<<endl; } return p; }//矩阵加法 Matrax muli(Matrax a,Matrax b){ Matrax p; for(int i=0;i<n;i++) for(int j=0;j<n;j++){ p.m[i][j]=0; for(int k=0;k<n;k++){ p.m[i][j]+=a.m[i][k]*b.m[k][j]; p.m[i][j]%=m; } } return p; }//矩阵乘法 Matrax quick_mod(Matrax a,int b){ Matrax ans=ter; while(b){ if(b&1){ ans=muli(ans,a); b--; } else { b>>=1; a=muli(a,a); } } return ans; }//快速幂 Matrax sum(Matrax a,int k){ if(k==1)return a; Matrax ans,b; ans=sum(a,k/2); if(k&1){ b=quick_mod(a,k/2+1); ans=add(ans,muli(ans,b)); ans=add(ans,b); } else { b=quick_mod(a,k/2); ans=add(ans,muli(ans,b)); } return ans; }//二分求和
<span style="font-family: Arial, Helvetica, sans-serif;">int main(){</span>
int k; while(scanf("%d%d%d",&n,&k,&m)!=EOF){ Matrax A,tmp; for(int i=0;i<n;i++) for(int j=0;j<n;j++){ scanf("%I64d",&A.m[i][j]); ter.m[i][j]=(i==j); tmp.m[i][j]=0; } tmp=sum(A,k); for(int i=0;i<n;i++){ for(int j=0;j<n;j++) cout<<tmp.m[i][j]<<" "; cout<<endl; } } return 0; }
以上是关于poj 3233(矩阵快速幂)的主要内容,如果未能解决你的问题,请参考以下文章
POJ 3233 Matrix Power Series 经典矩阵快速幂+二分
poj3233 Matrix Power Series 矩阵快速幂