数学专项matrix:UVa 10689

来源:互联网 发布:控制孩子上网软件 编辑:程序博客网 时间:2024/05/16 09:30

快速幂模板题。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;typedef int matrix[3][3];int mod;int a,b,n,m;void mat_mul(matrix A,matrix B,matrix res){    matrix C;    memset(C,0,sizeof(C));    for(int i=0;i<2;i++)        for(int j=0;j<2;j++)            for(int k=0;k<2;k++)                C[i][j]=(C[i][j]+A[i][k]*B[k][j])%mod;    memcpy(res,C,sizeof(C));}void mat_pow(matrix A,int n,matrix res){    matrix a,r;    memset(r,0,sizeof(r));    memcpy(a,A,sizeof(a));    for(int i=0;i<2;i++) r[i][i]=1;    while(n)    {        if(n&1) mat_mul(r,a,r);        n>>=1;        mat_mul(a,a,a);    }    memcpy(res,r,sizeof(r));}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%d%d%d%d",&a,&b,&n,&m);        mod=1;for(int i=0;i<m;i++) mod*=10;        a%=mod;b%=mod;        if(n==0)        {            printf("%d\n",a);            continue;        }        matrix A;        A[0][0]=0;A[0][1]=1;A[1][1]=1;A[1][0]=1;        mat_pow(A,n-1,A);        int ans=(A[1][0]*a%mod+A[1][1]*b%mod)%mod;        printf("%d\n",ans);    }    return 0;}


原创粉丝点击