[SDOI2009]HH去散步

来源:互联网 发布:k60数据手册 编辑:程序博客网 时间:2024/05/12 17:53

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

代码还是很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 45989using 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");}


0 0