zoukankan      html  css  js  c++  java
  • HDU1757又是一道矩阵快速幂模板题

    题目链接: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;
    }
  • 相关阅读:
    739. Daily Temperatures
    556. Next Greater Element III
    1078. Occurrences After Bigram
    1053. Previous Permutation With One Swap
    565. Array Nesting
    1052. Grumpy Bookstore Owner
    1051. Height Checker
    数据库入门及SQL基本语法
    ISCSI的概念
    配置一个IP SAN 存储服务器
  • 原文地址:https://www.cnblogs.com/xiaowuga/p/7169547.html
Copyright © 2011-2022 走看看