首页 > 代码库 > bzoj4417: [Shoi2013]超级跳马

bzoj4417: [Shoi2013]超级跳马

裸矩阵快速幂。

#include<cstdio>#define N 100const int p=30011;int n,m;typedef int ds[N][N];ds f,q,a;void mul(ds u,ds v){	for(int i=0;i!=n*2;++i)		for(int j=0;j!=n*2;++j)			a[i][j]=0;	for(int i=0;i!=n*2;++i)		for(int j=0;j!=n*2;++j)			for(int k=0;k!=n*2;++k)				a[i][j]=(a[i][j]				+u[i][k]*v[k][j])%p;	for(int i=0;i!=n*2;++i)		for(int j=0;j!=n*2;++j)			u[i][j]=a[i][j];}int main(){	scanf("%d%d",&n,&m);	if(!--m){		printf("%d\n",n==1);		return 0;	}	for(int i=0;i!=n;++i){		q[i+n][i+n]		=q[i][i]=1;		f[i+n][i]=1;	}	for(int i=n;i!=n*2;++i){		f[i-n][i]		=f[i][i]=1;		if(i-1>=n)			f[i-1][i]=1;		if(i+1<n*2)			f[i+1][i]=1;	}	for(;m;m>>=1){		if(m%2)mul(q,f);		if(m/2)mul(f,f);	}	printf("%d\n",(q[n]	[n-2]+q[n][n-1])%p);}

  

bzoj4417: [Shoi2013]超级跳马