题目大意:

给你一个递推式:

f(x)=f(x1)+2f(x2)+x4
,输入起始两项a,b和一个整数n,让你求第n项f(n)的值。

分析:

求一个转移矩阵就好了,然后矩阵快速幂手打了一次。

代码:

#include<bits/stdc++.h>
using namespace std;
#define mod 2147493647
struct point
{
    long long int a[8][8];
};
long long int xcx[8][8]=
{
    {0,0,0,0,0,0,0,0},
    {0,1,2,1,0,0,0,0},
    {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}
};
long long int ans=0;
long long int star[8]={0,0,0,81,27,9,3,1};
point get_mul(point a,point b)
{
    point ans;
    for(int i=1;i<8;i++)
    {
        for(int j=1;j<8;j++)
        {
            ans.a[i][j]=0;
            for(int k=1;k<8;k++)
            {
                ans.a[i][j]+=(a.a[i][k]*b.a[k][j]);
                ans.a[i][j]%=mod;
            }
        }
    }
    return ans;
}
void out_put(point x)
{
    for(int i=1;i<8;i++)
    {
        for(int j=1;j<8;j++)
        {
            printf("%d ",x.a[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    int t;
    long long int n;
    scanf("%d",&t);
    while(t--)
    {
        ans=0;
        scanf("%lld%lld%lld",&n,&star[2],&star[1]);
        point e;
        point now;
        for(int i=0;i<8;i++)
        {
            for(int j=0;j<8;j++)
            {
                if(i==j)e.a[i][j]=1;
                else e.a[i][j]=0;
                now.a[i][j]=xcx[i][j];
            }
        }
        n-=2;
        while(n>0)
        {
            if(n%2==1)
            {
                e=get_mul(e,now);
            }
            now=get_mul(now,now);
            n/=2;
        }
        for(int i=1;i<8;i++)
        {
            ans+=(e.a[1][i]*star[i]);
            ans%=mod;
        }
        //out_put(e);
        printf("%lld\n",ans);
    }
}