poj 3233(矩阵快速幂)

来源:互联网 发布:淘宝的价格怎么定价 编辑:程序博客网 时间:2024/05/13 09:28

题目链接: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;}


0 0
原创粉丝点击