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; }//二分求和 int main(){ 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; }