hdu 4565——So Easy!

来源:互联网 发布:新手如何经营淘宝 编辑:程序博客网 时间:2024/04/30 13:09



#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define LL __int64LL a,b,n,m;void Mul(LL mat1[2][2],LL mat2[2][2],LL mat[2][2]){    for(int i=0;i<2;i++)        for(int j=0;j<2;j++)        {            LL sum=0;            for(int k=0;k<2;k++)                sum+=(mat1[i][k]*mat2[k][j])%m;            mat[i][j]=sum%m;        }}void Pow(LL mat[2][2],LL k){    if(k==1) return ;    LL mat1[2][2],mat2[2][2];    memcpy(mat1,mat,sizeof(mat1));    Pow(mat1,k>>1);    if(k&1)    {        Mul(mat1,mat,mat2);        Mul(mat2,mat1,mat);    }    else        Mul(mat1,mat1,mat);}int main(){    while(cin>>a>>b>>n>>m)    {        if(n==0)        {            printf("2\n");continue;        }                    if(n==1)        {            printf("%I64d\n",2*a%m);continue;        }                    if(n==2)        {            printf("%I64d\n",(2*a*a%m+2*b)%m);continue;        }                    LL mat[2][2];        mat[0][0]=2*a;   mat[0][1]=((b-a*a)%m+m)%m;        mat[1][0]=1;     mat[1][1]=0;        Pow(mat,n);        printf("%I64d\n",(mat[1][0]*2*a+mat[1][1]*2)%m);    }    return 0;}


原创粉丝点击