BZOJ 1898 沼泽鳄鱼

矩阵快速幂。

少了个引用调了一晚上。。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 55
#define mod 10000
using namespace std;
long long n,m,s,t,k,r,map[maxv][maxv];
long long type,x,y,z,w;
bool vis[maxv][13];
struct matrix
{
    long long a[maxv][maxv];
}tr[13],a,b;
matrix mul(matrix a,matrix b)
{
    matrix c;
    for (long long i=1;i<=n;i++)
        for (long long j=1;j<=n;j++)
            c.a[i][j]=0;
    for (long long i=1;i<=n;i++)
        for (long long j=1;j<=n;j++)
        {
            for (long long k=1;k<=n;k++)
                c.a[i][j]=(c.a[i][j]+(a.a[i][k]*b.a[k][j])%mod)%mod;
        }
    return c;
}
void get_table()
{
    for (long long i=1;i<=n;i++)
    {
        if (i==s) a.a[1][s]=1;
        else a.a[1][i]=0;
    }
    for (long long i=1;i<=12;i++)
    {
        for (long long j=1;j<=n;j++)
            for (long long k=1;k<=n;k++)
                tr[i].a[j][k]=map[j][k];
        for (long long j=1;j<=n;j++)
        {
            if (vis[j][i])
            {
                for (long long k=1;k<=n;k++)
                    tr[i].a[k][j]=0;
            }
        }
    }
    for (int i=1;i<=n;i++) b.a[i][i]=1;
    for (long long i=1;i<=12;i++)
        b=mul(b,tr[i]);
}
void f_pow(matrix &a,long long y)
{
    if (!y) return;
    matrix ans=a,base=b;
    while (y)
    {
        if (y&1) ans=mul(ans,base);
        base=mul(base,base);
        y>>=1;
    }
    a=ans;
}
long long get_ans()
{
    f_pow(a,k/12);
    for (long long i=1;i<=k%12;i++)
        a=mul(a,tr[i]);
    printf("%d\n",a.a[1][t]);
}
int main()
{
    scanf("%lld%lld%lld%lld%lld",&n,&m,&s,&t,&k);s++;t++;
    for (long long i=1;i<=m;i++)
    {
        scanf("%lld%lld",&x,&y);
        x++;y++;
        map[x][y]=map[y][x]=1;
    }
    scanf("%lld",&r);
    for (long long i=1;i<=r;i++)
    {
        scanf("%lld",&type);
        if (type==2)
        {
            scanf("%lld%lld",&x,&y);x++;y++;
            for (long long j=1;j<=12;j++)
            {
                if (j&1) vis[y][j]=true;
                else vis[x][j]=true;
            }
        }
        else if (type==3)
        {
            scanf("%lld%lld%lld",&x,&y,&z);x++;y++;z++;
            for (long long j=1;j<=12;j++)
            {
                if (j%3==1) vis[y][j]=true;
                else if (j%3==2) vis[z][j]=true;
                else vis[x][j]=true;
            }
        }
        else
        {
            scanf("%lld%lld%lld%lld",&x,&y,&z,&w);x++;y++;z++;w++;
            for (long long j=1;j<=12;j++)
            {
                if (j%4==1) vis[y][j]=true;
                else if (j%4==2) vis[z][j]=true;
                else if (j%4==3) vis[w][j]=true;
                else vis[x][j]=true;
            }
        }
    }
    get_table();
    get_ans();
    return 0;
}
时间: 2024-10-10 01:46:58

BZOJ 1898 沼泽鳄鱼的相关文章

矩阵乘法专题3——bzoj 1898 [Zjoi2004]Swamp 沼泽鳄鱼 题解

[原题] 1898: [Zjoi2004]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 425  Solved: 256 [Submit][Status] Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥,每座石桥连接着两座石墩,且每两座石墩之间至多只有一座石桥.这

BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼

1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1085  Solved: 604[Submit][Status][Discuss] Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥,每座石桥连接着两座石墩,且每两座石墩之间至多只有一座石

BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼 [矩阵乘法]

1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1082  Solved: 602[Submit][Status][Discuss] Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥,每座石桥连接着两座石墩,且每两座石墩之间至多只有一座石

BZOJ 1898 ZJOI 2004 Swamp 沼泽鳄鱼 矩阵乘法

题目大意 给出一张无向图,这个图中有一些鱼,他们不同的时间会出现在固定的位置,呈周期性循环,一个人要在这个图上走,他不能和鱼同时在一个点上.问从s到t走k步有多少种方案. 思路 注意到鱼的循环只可能是2/3/4,也就是说最多经过12个时间点之后,状态又会和一开始相同.所以预处理12个矩阵用来转移.分为k/12和k%12来处理. 当鱼在一个位置上的时候,当前时间从这个位置出发的一行和上一个时间到达这个点的一列需要清零. CODE #define _CRT_SECURE_NO_WARNINGS #i

OI本月刷水记录

bzoj 1044 硬币购物 如果没有每个硬币的个数限制,这就是一个完全背包计数问题,现在我们注意到硬币个数很少,于是我们分别考虑一下每个硬币不符合条件的情况,容斥一下即可 bzoj 1225假如不考虑高精度的情况,那么转移还是好考虑的 f[i][j]表示前i个质数有j的约数最小数字 f[i][j]=minprime[i]k|jf[i?1][j/(k+1)]?prime[i]k 但万恶的高精度啊= =,于是改成搜索,然后用对数来表示,就好了 bzoj 2440 一道很神的数论题,二分+容斥+莫比

1898: [Zjoi2005]Swamp 沼泽鳄鱼

矩阵乘法. 邻接矩阵用矩阵乘法可以得到最后的方案数 食人鱼是周期性的移动可以用12个矩阵表示.12个矩阵乘在一起得到第13个矩阵. 然后k/12的部分用第13个矩阵快速幂转移,再乘下剩余的矩阵. #include<cstdio> #include<algorithm> #include<cstring> #define LL long long using namespace std; const int maxn = 50 + 10; const int mod =

BZOJ1898: [Zjoi2004]Swamp 沼泽鳄鱼

1898: [Zjoi2004]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 478  Solved: 286[Submit][Status] Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥,每座石桥连接着两座石墩,且每两座石墩之间至多只有一座石桥.这个景点造好之后

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445