hdu 1005 矩阵快速幂

来源:互联网 发布:淘宝女装代发货源 编辑:程序博客网 时间:2024/06/02 05:16

题意:A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7。Given A, B, and n, you are to calculate the value of f(n).
分析:
这题以前做过,还写了个题解:hdu 1005
对于这题,主要是将做给的那个公式转化成矩阵的形式。
| f[n] |= |A B|*| f[n-1] |
| f[n-1] | |1 0| | f[n-2] |

#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef long long ll;const int mod=7;const int N=2;struct Mat{    int mat[N][N];};int n=2,A,B;Mat mul(Mat a,Mat b){    Mat c; memset(c.mat,0,sizeof(c.mat));    for(int k=0;k<n;k++)    for(int i=0;i<n;i++)    for(int j=0;j<n;j++){        c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];        c.mat[i][j]%=mod;    }    return c;}Mat qmod(Mat a,int k){    Mat c;    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)        c.mat[i][j]=(i==j);    for(;k;k>>=1){        if(k&1)c=mul(c,a);        a=mul(a,a);    }    return c;}int main(){    int k;    while(~scanf("%d%d%d",&A,&B,&k)&&(A+B+k)){        if(k==1||k==2){            printf("1\n");continue;        }        Mat a;        a.mat[0][0]=A%mod; a.mat[0][1]=B%mod;        a.mat[1][0]=1; a.mat[1][1]=0;        Mat c=qmod(a,k-2);        printf("%d\n",(c.mat[0][0]+c.mat[0][1])%mod);    }    return 0;}
0 0
原创粉丝点击