比赛 201712练习 评测结果 AAAAAAAAAA
题目名称 沼泽鳄鱼 最终得分 100
用户昵称 胡嘉兴 运行时间 0.085 s
代码语言 C++ 内存使用 0.51 MiB
提交时间 2017-12-24 22:15:36
显示代码纯文本
#include<bits/stdc++.h>
#define N 57
#define mod 10000
using namespace std;
struct matrix
{
    int A[N][N];
};
matrix ans, sum[13], g, vis;
matrix mul(matrix a, matrix b, int n)
{
    matrix r;
    memset(r.A, 0, sizeof(r.A));
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            for(int k = 0; k < n; k++)
            {
                r.A[i][j] += a.A[i][k]*b.A[k][j];
            }
            r.A[i][j] %= mod;
        }
    }
    return r;
}
int main()
{
    int n, k, s, e, m, nf, mk;
    freopen("swamp.in","r",stdin);
	freopen("swamp.out","w",stdout);
    scanf("%d%d%d%d%d", &n, &m, &s, &e, &k);
    for(int i = 0; i <= n; i++)
    {
        for(int j = 0; j <= n; j++)
        {
            ans.A[i][j] = (i==j);
            vis.A[i][j] = 0;
            sum[0].A[i][j] = (i==j);
            for(int l = 1; l < 13; l++)
            {
                sum[l].A[i][j] = 0;
            }
        }
    }
    for(int i = 1; i <= m; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        g.A[x][y] = g.A[y][x] = 1;
    }
    scanf("%d", &nf);
    for(int i = 1; i <= nf; i++)
    {
        int t;
        scanf("%d", &t);
        for(int j = 0; j < t; j++)
        {
            int p, h = j;
            scanf("%d", &p);
            while(h<=12)
            {
                vis.A[p][h] = 1;
                h += t;
            }
        }
    }
	for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            if(!vis.A[i][0]&&!vis.A[j][1])
            {
                sum[1].A[i][j] = g.A[i][j];
            }
        }
    }
    for(int i = 1; i < 12; i++)
    {
        for(int j = 0; j < n; j++)
        {
            for(int l = 0; l < n; l++)
            {
                for(int p = 0; p < n; p++)
                {
                    if(!vis.A[l][i+1])
                    {
                        sum[i+1].A[j][l] += sum[i].A[j][p]*g.A[p][l];
                    }
                }
                sum[i+1].A[j][l] %= mod;
            }
        }
    }
    g = sum[12];
    mk = k%12;
    k -= mk;
    k /= 12;
    while(k)
    {
        if(k&1)
        {
            ans = mul(ans, g, n);
        }
        g = mul(g, g, n);
        k >>= 1;
    }
    ans = mul(ans, sum[mk], n);
    printf("%d\n", ans.A[s][e]);
    return 0;
}