洛谷P2233 [HNOI2002]公交车路线

矩阵乘法

我们之前了解到一个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

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/81138501