矩阵乘法
我们之前了解到一个01邻接矩阵的k次幂就是每个点经过k条边到达其他点的方案数,这个题也是
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
const int mod=1000;
int n;
struct mtix
{
lli x[10][10];
mtix(){memset(x,0,sizeof(x));}
}f;
mtix mul(mtix a,mtix b)
{
mtix c;
for (int i=1;i<=8;i++)
for (int j=1;j<=8;j++)
for (int k=1;k<=8;k++)
if (k!=5) c.x[i][j]=(c.x[i][j]+a.x[i][k]*b.x[k][j])%mod;
return c;
}
void mpow(int y)
{
mtix ans=f;
for (;y;f=mul(f,f),y>>=1)
if (y&1) ans=mul(ans,f);
cout<<ans.x[1][5];
return ;
}
signed main()
{
cin>>n;
for (int i=1;i<8;i++) f.x[i][i+1]=f.x[i+1][i]=1;
f.x[1][8]=f.x[8][1]=1;
mpow(n-1);
return 0;
}
//Don't let this slip away