UVa 10870

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1811

矩阵快速幂

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#include<queue>
#include<stdexcept>
#include<bitset>
#include<cassert>
#include<deque>


using namespace std;

typedef long long ll;
typedef unsigned int uint;
const double eps=1e-12;
const int INF=0x3f3f3f3f;
const int N=50;
ll ma[N][N],mb[N][N],mc[N][N];
void matrixMul(ll a[][N],ll b[][N],int n,int m,int k,ll MOD)
{
    memset(mc,0,sizeof(mc));
    for(int i=1;i<=n;++i)
    for(int j=1;j<=k;++j)
    for(int l=1;l<=m;++l)
    mc[i][j]=(mc[i][j]+a[i][l]*b[l][j]%MOD)%MOD;
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    a[i][j]=mc[i][j];
}
int main()
{
    //freopen("data.in","r",stdin);
    int d,n;
    ll m;
    while(cin>>d>>n>>m)
    {
        if(!d&&!n&&!m) break;
        memset(mb,0,sizeof(mb));
        for(int i=1;i<=d;++i)
        cin>>mb[i][1];
        for(int i=2;i<=d;++i)
        mb[i-1][i]=1;
        for(int i=d;i>=1;--i)
        cin>>ma[1][i];
        if(n<=d)
        {
            cout<<ma[1][d+1-n]<<endl;
            continue;
        }
        n-=d;
        while(n)
        {
            if((n&1))
            matrixMul(ma,mb,1,d,d,m);
            n=n>>1;
            matrixMul(mb,mb,d,d,d,m);
        }
        cout<<ma[1][1]<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/liulangye/p/3202617.html