题目大意:
给你一个递推式:
分析:
求一个转移矩阵就好了,然后矩阵快速幂手打了一次。
代码:
#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);
}
}