BZOJ 1875 HH去散步

Posted on 2016-09-27 20:16  ziliuziliu  阅读(141)  评论(0编辑  收藏  举报

以边建矩阵快速幂。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 65
#define maxe 125
#define mod 45989
using namespace std;
struct matrix
{
    int a[maxe][maxe];
}a,b;
int n,m,k,s,t,x,y,cnt[maxv][maxe],nume=0;
void get_table()
{
    for (int i=0;i<m;i++)
        for (int j=0;j<m;j++)
            b.a[i][j]=0;
    for (int i=0;i<n;i++)
    {
        for (int j=1;j<=cnt[i][0];j++)
            for (int k=1;k<=cnt[i][0];k++)
                if (j!=k) b.a[cnt[i][j]][cnt[i][k]^1]++;
    }
    for (int i=1;i<=cnt[s][0];i++)
        a.a[0][cnt[s][i]^1]++;
}
matrix mul(matrix a,matrix b)
{
    matrix c;
    for (int i=0;i<m;i++)
        for (int j=0;j<m;j++)
            c.a[i][j]=0;
    for (int i=0;i<m;i++)
        for (int j=0;j<m;j++)
            for (int k=0;k<m;k++)
                c.a[i][j]=(c.a[i][j]+(a.a[i][k]*b.a[k][j])%mod)%mod;
    return c;
}
void f_pow(int y)
{
    while (y)
    {
        if (y&1) a=mul(a,b);
        b=mul(b,b);
        y>>=1;
    }
}
int main()
{
    scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        cnt[y][++cnt[y][0]]=nume++;
        cnt[x][++cnt[x][0]]=nume++;
    }
    m<<=1;get_table();
    f_pow(k-1);
    int sum=0;
    for (int i=1;i<=cnt[t][0];i++)
        sum=(sum+a.a[0][cnt[t][i]])%mod;
    printf("%d\n",sum);
    return 0;
}