HDU 5950 Recursive sequence(矩阵快速幂)

来源:互联网 发布:网络机柜检验报告 编辑:程序博客网 时间:2024/05/29 15:28

题意:

给出一个表达式 fn= fn-1 +  2*f(n-2 ) +n^4

思路:

重点在于n^4 的拆解,如何可以拆解为n-1的若干项的形式,可以考虑用二项式展开来拆解,也就是将n^4 拆解为 ((n-1)+1)^4,之后C(4,0)(n-1)^4+C(4,1)(n-1)^3如此即可

#include <iostream>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <queue>using namespace std;typedef long long ll;ll n,m;const int maxn=8;const ll mod=2147493647;struct Matrix//矩阵的类{  ll a[maxn][maxn];  void init()           //将其初始化为单位矩阵  {    memset(a,0,sizeof(a));    for(int i=1;i<maxn;i++)      a[i][i]=1;  }}  ;Matrix mul(Matrix a,Matrix b)  //(a*b)%mod  矩阵乘法{  Matrix ans;  memset(ans.a,0,sizeof(ans.a));  for(int i=1;i<maxn;i++)  {        ans.a[i][i]=1;  }  for(int i=1;i<maxn;i++)    for(int j=1;j<maxn;j++)    {      ans.a[i][j]=0;      for(int k=1;k<maxn;k++)        ans.a[i][j]+=a.a[i][k]*b.a[k][j]%mod;      ans.a[i][j]%=mod;    }    return ans;}Matrix pow(Matrix a){    Matrix res ;  memset(res.a,0,sizeof(res.a));  for(int i=1;i<maxn;i++)  {        res.a[i][i]=1;  }    while(n)    {        if(n&1)        {            res=mul(a,res);        }        a=mul(a,a);        n/=2;    }    return res;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        ll a,b;        scanf("%lld%lld%lld",&n,&a,&b);        Matrix ans;        ans.a[1][1]=b,ans.a[2][1]=a,ans.a[3][1]=16,ans.a[4][1]=8,ans.a[5][1]=4,ans.a[6][1]=2,ans.a[7][1]=1;        Matrix base,res;        ll sss[8][8]={        {0,0,0,0,0,0,0,0},        {0,1,2,1,4,6,4,1},        {0,1,0,0,0,0,0,0},        {0,0,0,1,4,6,4,1},        {0,0,0,0,1,3,3,1},        {0,0,0,0,0,1,2,1},        {0,0,0,0,0,0,1,1},        {0,0,0,0,0,0,0,1}};        for(int i=0;i<=7;i++)        {            for(int j=0;j<=7;j++)                base.a[i][j]=sss[i][j];        }        if(n==1)        {            printf("%lld\n",a);        }        else if(n==2)        {            printf("%lld\n",b);        }        else        {        n=n-2;        res=pow( base );        ans=mul(res,ans);        printf("%lld\n",ans.a[1][1]);        }    }}


原创粉丝点击