矩阵连乘模板

#include
#include
#include
#include

using namespace std;

const long long mod=1e9+7;

struct node
{
long long a[3][3];
};

node I={1,0,0,
0,1,0,
0,0,1};

inline node mul(node a,node b)
{
node ans;
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
ans.a[i][j]=0;
for(int k=0; k<3; k++)
{
ans.a[i][j]+=a.a[i][k]*b.a[k][j]%mod;
}
ans.a[i][j]%=mod;
}
}
return ans;
}

inline node qpow(node a,long long b)
{
node ans=I;

while(b)
{
    if(b&1)
        ans=mul(ans,a);
    a=mul(a,a);
    b>>=1;
}
return ans;

}

int main()
{
int t,n,k;
scanf("%d",&t);
while(t–)
{
scanf("%d %d",&n,&k);
if(k>n)
{
printf(“0\n”);
continue;
}
int len=n-k+1;
if(len<=3)
{
switch(len)
{
case 1:
printf(“1\n”);
break;
case 2:
printf(“2\n”);
break;
case 3:
printf(“5\n”);
break;
}
}
else
{
node ans;
ans.a[0][0]=2;
ans.a[0][1]=ans.a[1][1]=ans.a[1][2]=ans.a[2][0]=ans.a[2][1]=0;
ans.a[0][2]=2;
ans.a[1][0]=1;
ans.a[2][2]=2;
ans=qpow(ans,len-3);
long long res=(ans.a[0][0]*5%mod+ans.a[0][2]+ans.a[0][1]*2%mod+mod)%mod;
printf("%lld\n",res);
}
}
return 0;

}

你可能感兴趣的:(矩阵连乘)