码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1757又是一道矩阵快速幂模板题

时间:2017-07-14 14:45:07      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:ref   style   ini   sizeof   ons   efi   problem   ret   init   

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757

按照题目的要求构造矩阵

//Author: xiaowuga
//矩阵:
//a0 a1 a2 a3 a4 a5 a6 a7 a8 a9   9
// 1  0  0  0  0  0  0  0  0  0   8
// 0  1  0  0  0  0  0  0  0  0   7
// 0  0  1  0  0  0  0  0  0  0   6
// 0  0  0  1  0  0  0  0  0  0   5
// 0  0  0  0  1  0  0  0  0  0   4
// 0  0  0  0  0  1  0  0  0  0   3
// 0  0  0  0  0  0  1  0  0  0   2
// 0  0  0  0  0  0  0  1  0  0   1
// 0  0  0  0  0  0  0  0  1  0   0
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define N 10 
using namespace std;
typedef long long ll;
int k,MOD;
int arr[N],f[N];
struct Matrix{
    ll mat[N][N];
    //重定向乘法
    Matrix operator*(const Matrix &m)const{
        Matrix tmp;
        for(int i=0;i<N;i++)
            for(int j=0;j<N;j++){
                tmp.mat[i][j]=0;
                for(int k=0;k<N;k++){
                    tmp.mat[i][j]+=mat[i][k]*m.mat[k][j]%MOD;
                    tmp.mat[i][j]%=MOD;
                }
            }
        return tmp;
    }
};
ll POW(Matrix &m,int k){
    Matrix ans;
    memset(ans.mat,0,sizeof(ans.mat));
    for(int i=0;i<N;i++) ans.mat[i][i]=1;
    k-=9;
    while(k){
        if(k&1) ans=ans*m;
        k/=2;
       m=m*m; 
    }
    ll sum=0;
    for(int i=0;i<N;i++){
        sum+=ans.mat[0][i]*f[N-i-1]%MOD;
        sum%=MOD;
    }
    return sum;
}
void init(Matrix &m){
    memset(m.mat,0,sizeof(m.mat));
    for(int i=0;i<N;i++) m.mat[0][i]=arr[i];
    for(int i=0;i<N-1;i++) m.mat[i+1][i]=1;
    for(int i=0;i<N;i++) f[i]=i;
}
int main() {
    ios::sync_with_stdio(false);cin.tie(0);
    Matrix m;
    while(cin>>k>>MOD){
        for(int i=0;i<N;i++) cin>>arr[i];
        init(m);
        if(k<10) cout<<k%MOD<<endl;
        else cout<<POW(m,k)<<endl;
    }
    return 0;
}

 

HDU1757又是一道矩阵快速幂模板题

标签:ref   style   ini   sizeof   ons   efi   problem   ret   init   

原文地址:http://www.cnblogs.com/xiaowuga/p/7169547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!