题意:
对于给出的递推关系,求前n项和
思路:
数据大,有规律。矩阵快速幂吧。然而为啥这题long long 就TLE。智障题。
构造:
Sn=Sn-1+F(n)= Sn-1 +3F(n-1)+2F(n-2)+7F(n-3)
ans矩阵
9 0 0 0
0 3 0 0
0 0 2 0
0 0 0 7
base 矩阵
1 3 2 7
0 3 2 7
0 1 0 0
0 0 1 0
注意0 1 2 的情况。
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
struct matrix
{
int c[5][5];
}matrix_base,matrix_ans,temp;
int n;
int mod=2009;
matrix mult (matrix a,matrix b)
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
temp.c[i][j]=0;
for(int k=1;k<=4;k++)
temp.c[i][j]=(a.c[i][k]*b.c[k][j]+temp.c[i][j])%mod;
}
}
return temp;
}
void quick(matrix a)
{
while(n)
{
if(n&1)
{
matrix_ans=mult(a,matrix_ans );
}
a=mult(a,a);
n=n>>1;
}
int sum=(matrix_ans.c[1][1]+matrix_ans.c[1][2]+matrix_ans.c[1][3]+matrix_ans.c[1][4])%mod;
printf("%d\n",sum);
}
int main()
{
int T;
scanf("%d",&T);
for(int Case=1;Case<=T;Case++)
{
scanf("%d",&n);
printf("Case %d: ",Case);
if(n<3)
{
if(n==1)
{
printf("4\n");
}
else if(n==2)
{
printf("9\n");
}
else if(n==0)
{
printf("1\n");
}
}
else
{
n=n-2;
memset(matrix_ans.c,0,sizeof(matrix_ans.c));
matrix_base.c[1][1]=1,matrix_base.c[1][2]=3,matrix_base.c[1][3]=2,matrix_base.c[1][4]=7;
matrix_base.c[2][1]=0,matrix_base.c[2][2]=3,matrix_base.c[2][3]=2,matrix_base.c[2][4]=7;
matrix_base.c[3][1]=0,matrix_base.c[3][2]=1,matrix_base.c[3][3]=0,matrix_base.c[3][4]=0;
matrix_base.c[4][1]=0,matrix_base.c[4][2]=0,matrix_base.c[4][3]=1,matrix_base.c[4][4]=0;
matrix_ans.c[1][1]=9,matrix_ans.c[2][2]=5,matrix_ans.c[3][3]=3,matrix_ans.c[4][4]=1;
quick(matrix_base);
}
}
return 0;
}