bzoj1875 HH去散步 矩阵乘法

       这道题目题意真是。。。讲两个可能产生歧义的地方:

       1.重边算不同的方案,而且可以沿一条路走过去再沿重边回来;

       2.可以到达终点以后再绕一个圈子;可以回到曾经到过的点;

       那么看到不能沿重复的路回来,因此可以以边为状态构造转移矩阵。然后就没有然后了。。

 AC代码如下:

#include<iostream>
#include<cstdio>
#define mod 45989
#define N 155
using namespace std;

struct matrix{ int p[N][N]; }a,b; int n,m,t,sta,gol,cnt,x[N],y[N];
int read(){
	int x=0; char ch=getchar();
	while (ch<'0' || ch>'9') ch=getchar();
	while (ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }
	return x;
}
matrix tms(matrix x,matrix y){
	matrix z; int i,j,k;
	for (i=0; i<=cnt; i++)
		for (j=0; j<=cnt; j++){
			z.p[i][j]=0;
			for (k=0; k<=cnt; k++) z.p[i][j]=(z.p[i][j]+x.p[i][k]*y.p[k][j]%mod)%mod;
		}
	return z;
}
int main(){
	n=read(); m=read(); t=read(); int i,j;
	sta=read()+1; gol=read()+1; cnt=1;
	if (!m){ puts((sta==gol)?"1":"0"); return 0; }
	while (m--){
		x[++cnt]=read()+1; x[++cnt]=read()+1;
		y[cnt-1]=x[cnt]; y[cnt]=x[cnt-1];
	}
	for (i=2; i<=cnt; i++)
		for (j=2; j<=cnt; j++)
			if (y[i]==x[j] && (i^j)!=1) a.p[i][j]=1;
	for (i=2; i<=cnt; i++){
		if (y[i]==gol) a.p[i][1]=1;
		if (x[i]==sta) a.p[0][i]=1;
	}
	b.p[0][0]=1;
	for (i=t+1; i; i>>=1,a=tms(a,a))
		if (i&1) b=tms(b,a);
	printf("%d\n",b.p[0][1]);
	return 0;
}


by lych

2016.3.11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值