hdu 1757 A Simple Math Problem 矩阵快速幂

来源:互联网 发布:北京11选5遗漏数据查询 编辑:程序博客网 时间:2024/05/28 11:50

推出矩阵公式即可:(盗图)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1757

#include <stdio.h>#include <string.h>#include <stdlib.h>int len_Matrix;int Mod;struct Matrix{    int M[15][15];};int tempa[15];int a[15];void Init_Matrix(Matrix * tmp){    for(int i=0;i<len_Matrix;i++){        for(int j=0;j<len_Matrix;j++){            tmp -> M[i][j] = 0;        }    }    tmp -> M[1][0] = 1;    for(int i=1;i<len_Matrix;i++){        for(int j=1;j<len_Matrix;j++){            if(tmp -> M[i-1][j-1]){                tmp -> M[i][j] = 1;            }        }    }    for(int i=0;i<len_Matrix;i++){        tmp -> M[0][i] = tempa[i];    }}Matrix multiply(Matrix a1,Matrix a2){    Matrix ans;    for(int i=0;i<len_Matrix;i++){        for(int j=0;j<len_Matrix;j++){            ans.M[i][j] = 0;            for(int k=0;k<len_Matrix;k++){               ans.M[i][j] = (a1.M[i][k]*a2.M[k][j]+ans.M[i][j])%Mod;             }        }    }    return ans;}Matrix Pow(Matrix tmp,int nl){    Matrix ans ;    for(int i=0;i<len_Matrix;i++){        for(int j=0;j<len_Matrix;j++){            if(i==j)ans.M[i][j] = 1;            else ans.M[i][j] = 0;        }    }    while(nl){        if(nl&1){            ans = multiply(ans,tmp);        }        tmp = multiply(tmp,tmp);        nl /= 2;    }    return ans;}void Solve(int k,Matrix tmp){    if(k<10)        printf("%d\n",a[k]%Mod);    else{        Matrix ans = Pow(tmp,k-9);        //Debug_Matrix(ans);        int zans =0;        for(int i=0;i<len_Matrix;i++){            zans = (zans + ans.M[0][i] * a[9-i]) % Mod;        }        printf("%d\n",zans);    }}void Input(){    int k,m;    while(~scanf("%d %d",&k,&m)){       for(int i=0;i<10;i++){            scanf("%d",tempa+i);       }       len_Matrix = 10;       Mod = m;        Matrix tmp;       Init_Matrix(&tmp);       for(int i=0;i<10;i++){            a[i] = i;       }       Solve(k,tmp);    }}void File(){    freopen("a.in","r",stdin);    freopen("a.out","w",stdin);}int main(void){    //File();    Input();    return 0;}


0 0
原创粉丝点击