[SDOI2009]HH去散步

第一道矩乘也就不口胡了吧

代码还是很simple的~

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define rep(j,k,l) for (int j=k;j<=l;++j)
#define red(j,k,l) for (int j=k;j>=l;--j)
#define N 121
#define mod 45989

using namespace std;
int n,m,T,S,P,cnt,st[N],ne[N],to[N];
struct _233{
	
	int poi[N][N];
	void clear(){
		
		rep(i,1,2*m) rep(j,1,2*m) poi[i][j]=0;
		
	}
	
} a,b;

_233 operator*(_233 x,_233 y){
	
	_233 p;
	p.clear();
	rep(i,1,2*m) rep(k,1,2*m) if (x.poi[i][k]>0) rep(j,1,2*m)
		p.poi[i][j]=((p.poi[i][j]+x.poi[i][k]*y.poi[k][j])%mod);
	return p;
	
}

void add(int k,int l){
	
	to[++cnt]=l;
	ne[cnt]=st[k];
	st[k]=cnt;
	
}

_233 pow(int k){
	
	_233 l=b,ans=b;
	k--;if (k<0) ans.clear(),k=0;
	while (k){
		
		if (k&1) ans=ans*l;
		l=l*l;
		k=k>>1;
		
	}
	return ans;
	
}

int main(){
	
	scanf("%d%d%d%d%d",&n,&m,&T,&S,&P);
	rep(i,1,m){
		
		int k,l;
		scanf("%d%d",&k,&l);
		add(k,l);add(l,k);
		a.poi[k][l]++;a.poi[l][k]++;
		
	}
	if (T<=1){
		
		if (T==0) puts("0");
		else printf("%d\n",a.poi[S][P]);
		system("pause");
		return 0;
		
	}
	
	rep(i,1,2*m)
		for (int j=st[to[i]];j;j=ne[j])
			if (((i+1)^(j+1))^1) b.poi[i][j]++;
	b=pow(T-1);
	
	int ans=0;
	for (int i=st[S];i;i=ne[i])
		for (int j=st[P];j;j=ne[j])
			ans=(ans+b.poi[i][((j+1)^1)-1])%mod;
	printf("%d\n",ans);
	system("pause");
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值