zoukankan      html  css  js  c++  java
  • HDU 1757 矩阵快速幂加速递推

    题意:
    已知:
    当x<10时:f(x)=x
    否则:f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ……+ a9 * f(x-10);
    求:f(x)%m的值。
    思路:
    矩阵快速幂加速递推。 嗯嗯

    // by SiriusRen
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int cases,k,ans,a[10][10],mod;
    struct matrix{int a[10][10];void init(){memset(a,0,sizeof(a));}}first,cpy,td;
    matrix mul(matrix &a,matrix &b,int x){
        matrix temp;temp.init();
        for(int i=0;i<10;i++)
            for(int j=0;j<x;j++)
                for(int k=0;k<10;k++)
                temp.a[i][j]=(a.a[i][k]*b.a[k][j]+temp.a[i][j])%mod;
        return temp;
    }
    int main(){
        while(~scanf("%d%d",&k,&mod)){
            cpy.init();first.init();
            ans=0;
            for(int i=0;i<10;i++)scanf("%d",&first.a[9][9-i]),cpy.a[9][9-i]=first.a[9][9-i];
            for(int i=0;i<9;i++)first.a[i][i+1]=cpy.a[i][i+1]=1;
            for(int i=0;i<10;i++)td.a[i][0]=i;
            if(k<10)printf("%d
    ",k%mod);
            else{k-=10;
                while(k){
                    if(k&1)first=mul(cpy,first,10);
                    cpy=mul(cpy,cpy,10);k>>=1;
                }
                first=mul(first,td,1);
                printf("%d
    ",first.a[9][0]);
            }
        }
    }

    这里写图片描述

  • 相关阅读:
    Tomcat安装与配置
    模板方法模式
    观察者模式
    访问者模式
    策略模式
    迭代器模式
    状态模式
    访问者模式
    备忘录模式
    解释器模式
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532387.html
Copyright © 2011-2022 走看看