hdu 4686 Arc of Dream_矩阵快速幂

来源:互联网 发布:知乎的神回复 编辑:程序博客网 时间:2024/05/29 12:33

题意:略

构造出矩阵就行了

                                                                      |   AX   0    AXBY   AXBY       0  |
                                                                      |   0     BX    AYBX    AYBX    0  |
{a[i-1]   b[i-1]   a[i-1]*b[i-1]  AoD[i-1]  1}*        |   0     0      AXBX      AXBX   0  |  = {a[i]   b[i]   a[i]*b[i]  AoD[i]  1}
                                                                      |   0    0     0           1              0    |
                                                                      |  AY    BY   AYBY   AYBY     1   |

#include <iostream>#include<cstdio>#include<cstring>using namespace std;#define LL __int64#define N 5#define m 1000000007 struct node{    LL mat[N][N];    node operator *(const node &x){            node tmp;            memset(tmp.mat,0,sizeof(tmp.mat));            for(int i=0;i<N;i++)            for(int k=0;k<N;k++)            if(mat[i][k])                for(int j=0;j<N;j++){                    tmp.mat[i][j]+=(mat[i][k]*x.mat[k][j])%m;                    tmp.mat[i][j]%=m;                }            return tmp;    }}cat,b;void _pow(LL n){    while(n){        if(n&1)                    b=b*cat;        cat=cat*cat;        n>>=1;    }    //return b;}int main(int argc, char** argv) {    LL a0,ax,ay,b0,bx,by;    LL n;    while(scanf("%I64d",&n)!=EOF){        scanf("%I64d%I64d%I64d",&a0,&ax,&ay);        scanf("%I64d%I64d%I64d",&b0,&bx,&by);        //printf("!%I64d %I64d %I64d\n",a0,ax,ay);        //printf("!%I64d %I64d %I64d\n",b0,bx,by);        memset(cat.mat,0,sizeof(cat.mat));        cat.mat[3][0]=cat.mat[4][4]=cat.mat[0][0]=1;        cat.mat[1][1]=ax;        cat.mat[4][1]=ay;        cat.mat[2][2]=bx;        cat.mat[4][2]=by;        cat.mat[1][3]=ax*by%m;        cat.mat[2][3]=ay*bx%m;        cat.mat[3][3]=ax*bx%m;        cat.mat[4][3]=ay*by%m;        b.mat[0][0]=0;        b.mat[0][1]=a0;        b.mat[0][2]=b0;        b.mat[0][3]=a0*b0%m;        b.mat[0][4]=1;        _pow(n);        printf("%I64d\n",b.mat[0][0]);            }            return 0;}


原创粉丝点击