HDU - 4990 Reading comprehension (矩阵快速幂)

来源:互联网 发布:淘宝车模店怎么开 编辑:程序博客网 时间:2024/04/29 04:59

两种快速幂的方法,递推式如下:


1、分奇偶数:

    奇数F(x)=4*F(x-1)+1;

    偶数F(x)=4*F(x-1)+2;



2、F(x)=F(x-1)+2*F(x-2)+1


#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <algorithm>#include <fstream>#include <set>#include <map>#include <queue>#include <stack>#include <list>#include <vector>#include <cmath>#include <iomanip>typedef long long LL;typedef unsigned long long LLU;const double PI=acos(-1.0);using namespace std;const int N=4;LL MOD;int n;struct Matrix{    LL m[N][N];} init;Matrix Mult(Matrix m1,Matrix m2){    Matrix ans;    for(int i=0; i<2; i++)        for(int j=0; j<2; j++)        {            ans.m[i][j]=0;            for(int k=0; k<2; k++)                ans.m[i][j]=(ans.m[i][j]+m1.m[i][k]*m2.m[k][j])%MOD;        }    return ans;}Matrix Pow(Matrix m1,int b){    Matrix ans;    for(int i=0; i<2; i++)        for(int j=0; j<2; j++)            ans.m[i][j]=(i==j);    while(b)    {        if(b&1)            ans=Mult(ans,m1);        m1=Mult(m1,m1);        b>>=1;    }    return ans;}int main(){    memset(init.m, 0, sizeof(init.m));    init.m[0][0]=4;    init.m[0][1]=1;    init.m[1][0]=0;    init.m[1][1]=1;    while(cin>>n>>MOD)    {        Matrix ans=Pow(init, (n+1)/2);        Matrix unit;        unit.m[0][0]=unit.m[0][1]=unit.m[1][1]=0;        if(n&1)            unit.m[1][0]=1;        else            unit.m[1][0]=2;        ans=Mult(ans, unit);        cout<<ans.m[0][0]<<endl;    }    return 0;}


0 0