• UVA10870—Recurrences(简单矩阵快速幂)


    题目链接:https://vjudge.net/problem/UVA-10870

    题目意思:

    给出a1,a2,a3,a4,a5………………ad,然后算下面这个递推式子,简单的矩阵快速幂,裸题,但是第一个次遇到了矩阵大小不确定的矩阵快速幂,而且在这道题里面第一次明白了如何构造矩阵。算是矩阵快速幂的学习的一个小里程碑吧。

    f(n) = a1 *f(n - 1) + a2 *f(n - 2) + a3 *f(n - 3) + … + ad* f(n - d),  n > d.求f(n)

    代码:

     1 //Author: xiaowuga
     2 #include <bits/stdc++.h>
     3 #define maxx INT_MAX
     4 #define minn INT_MIN
     5 #define inf 0x3f3f3f3f
     6 using namespace std;
     7 typedef long long ll;
     8 ll n;
     9 ll MOD;
    10 struct Matrix{
    11     ll mat[101][101];
    12     void clear(){
    13         memset(mat,0,sizeof(mat));
    14     }
    15     Matrix operator * (const Matrix & m) const{
    16         Matrix tmp;
    17         tmp.clear();
    18         for(int i=0;i<n;i++)
    19             for(int k=0;k<n;k++){
    20                 if(mat[i][k]==0) continue;
    21                 for(int j=0;j<n;j++){
    22                     tmp.mat[i][j]+=mat[i][k]*m.mat[k][j]%MOD;
    23                     tmp.mat[i][j]%=MOD;
    24                 }
    25             }
    26         return tmp;
    27     }
    28 };
    29 Matrix POW(Matrix &m,int k){
    30     Matrix ans;
    31     memset(ans.mat,0,sizeof(ans.mat));
    32     for(int i=0;i<n;i++) ans.mat[i][i]=1;
    33     while(k){
    34         if(k&1) ans=ans*m;
    35         k/=2;
    36         m=m*m;
    37     }
    38     return ans;
    39 }
    40 int main() {
    41     ios::sync_with_stdio(false);cin.tie(0);
    42     int T;
    43     while(cin>>n>>T>>MOD&&n&&T&&MOD){
    44        Matrix m; 
    45        m.clear();
    46        for(int i=0;i<n;i++){
    47            cin>>m.mat[0][i];
    48            m.mat[0][i]%=MOD;
    49        }
    50        ll f[101];
    51        for(int i=0;i<n;i++){
    52            cin>>f[i];
    53        }
    54        for(int i=1;i<n;i++){
    55            m.mat[i][i-1]=1;
    56        }
    57        Matrix ans=POW(m,T-n);
    58        ll sum=0;
    59        for(int i=0;i<n;i++){
    60             sum=sum+ans.mat[0][i]*f[n-1-i]%MOD;
    61             sum%=MOD;
    62        }
    63        cout<<sum<<endl;
    64     }
    65     return 0;
    66 }
    View Code
  • 相关阅读:
    ajax 笔记--调用WebService实现求两数之和
    多数据之间的连接操作集中几个.NET常用的方法(不完整)
    判断用户是否存在(通过参数来实现)
    我的机子放到公司了
    给同事过生日,我弄菜,给同事买饭,我值班。
    多数据之间的连接操作MSSQL(不完整)
    TreeView连接数据
    字符编码
    计算机基础
    python入门
  • 原文地址:https://www.cnblogs.com/xiaowuga/p/7356449.html
Copyright © 2020-2023  润新知