1. 程式人生 > >Recursive sequence(矩陣快速冪)

Recursive sequence(矩陣快速冪)

題目大意:

f(n+1)=2*f(n-1)+f(n)+(n+1)^4

f(1)=a;f(2)=b;

求第n項。要mod

思路:裸的。。。構造矩陣

附上隊友醜陋優秀的程式碼:

#include<bits/stdc++.h>
///#define mod 2147493647
using namespace std;
typedef long long ll;
const ll mod=2147493647UL;
struct matrix
{
    ll m[10][10];
};
matrix mutil(matrix a,matrix b)
{
    matrix c;
    memset(c.m,0,sizeof(c.m));
    for(int i=1;i<=7;i++)
    {
        for(int j=1;j<=7;j++)
        {
            for(int k=1;k<=7;k++)
            {
                c.m[i][j]+=(a.m[i][k]%mod*b.m[k][j]%mod)%mod;
            }
            c.m[i][j]%=mod;
        }
    }
    return c;
}
matrix power(matrix A,ll k)
{
    matrix ans;
    for(int i=1;i<=7;i++)
    {
        for(int j=1;j<=7;j++)
        {
            if(i==j)
            ans.m[i][j]=1;
            else
                ans.m[i][j]=0;
        }
    }
    while(k)
    {
        if(k&1)
        {
            ans=mutil(ans,A);
            k--;
        }
        k>>=1;
        A=mutil(A,A);
    }
    return ans;
}
int main()
{
    ll n,i,j,t;
    ll a,b,res;
    scanf("%lld",&t);
    while(t--)
    {
        scanf("%lld%lld%lld",&n,&a,&b);
        if(n==1)
            printf("%lld\n",a);
        else if(n==2)
            printf("%lld\n",b);
        else
        {
            matrix A;
            for(i=1;i<=7;i++)
            {
                for(j=1;j<=7;j++)
                {
                  A.m[i][j]=0;
                }
            }
            A.m[1][1]=1;A.m[1][2]=2;A.m[1][3]=1;
            A.m[2][1]=1;
            A.m[3][3]=1;A.m[3][4]=4;A.m[3][5]=6;A.m[3][6]=4;A.m[3][7]=1;
            A.m[4][4]=1;A.m[4][5]=3;A.m[4][6]=3;A.m[4][7]=1;
            A.m[5][5]=1;A.m[5][6]=2;A.m[5][7]=1;
            A.m[6][6]=1;A.m[6][7]=1;
            A.m[7][7]=1;
            matrix ans=power(A,n-2);
            res=0;
            res=(res+ans.m[1][1]%mod*b%mod)%mod;
            res=(res+ans.m[1][2]*a%mod)%mod;
            res=(res+ans.m[1][3]*81%mod)%mod;
            res=(res+ans.m[1][4]*27%mod)%mod;
            res=(res+ans.m[1][5]*9%mod)%mod;
            res=(res+ans.m[1][6]*3%mod)%mod;
            res=(res+ans.m[1][7]%mod)%mod;
            ///res=(((ans.m[1][1]%mod*b%mod)%mod+(ans.m[1][2]*a)%mod)%mod+(ans.m[1][3]*81)%mod+(ans.m[1][4]*27)%mod+(ans.m[1][5]*9)%mod+(ans.m[1][6]*3)%mod+ans.m[1][7])%mod;
            printf("%lld\n",res);
        }
    }
}