zoukankan      html  css  js  c++  java
  • BZOJ 1898 沼泽鳄鱼(矩阵快速幂)

    没有食人鱼不是裸题吗,用一个向量表示从s到1..N的距离,然后不停乘邻接矩阵行了,当然快速幂
    有食人鱼,发现食人鱼最多十二个邻接矩阵一循环,处理出12个作为1个然后快速幂行了
     
    怎么处理呢?
    假设食人鱼在j时刻到达x这个点,那么j时刻的邻接矩阵x这一列全是0,因为他要求下一个矩阵的贡献上不能有x这一列贡献的。
     
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    const int N=52,MOD=1e4;
    typedef long long ll;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int n,m,s,t,k,x,y,fish,f[15];
    struct Mat{
        int a[N][N];
        Mat(){memset(a,0,sizeof(a));}
        void ini(){for(int i=1;i<=n;i++) a[i][i]=1;}
    }g[15],ans;
    inline Mat operator *(Mat A,Mat B){
        Mat C;
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++) if(A.a[i][k])
                for(int j=1;j<=n;j++) if(B.a[k][j])
                    C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%MOD;
        return C;
    }
    inline Mat operator ^(Mat A,int k){
        Mat ans;ans.ini();
        for(;k;k>>=1,A=A*A)
            if(k&1) ans=ans*A;
        return ans;
    }
    void print(Mat A){
        puts("hiMat");
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++) printf("%d ",A.a[i][j]);
            puts("");
        }
    }
    int main(){
        //freopen("in.txt","r",stdin);
        n=read();m=read();s=read()+1;t=read()+1;k=read();
        for(int i=1;i<=m;i++){
            x=read()+1;y=read()+1;
            for(int j=1;j<=12;j++) g[j].a[x][y]=g[j].a[y][x]=1;
        }
        fish=read();
        for(int i=1;i<=fish;i++){
            int T=read();
            for(int j=1;j<=T;j++) f[j]=read()+1;
            for(int j=1;j<=12;j++)
                for(int k=1;k<=n;k++) g[j].a[k][f[j%T+1]]=0;
        }
        g[0].ini();
        for(int i=1;i<=12;i++) g[0]=g[0]*g[i];
        ans=g[0]^(k/12);
        for (int i=1;i<=k%12;i++) ans=ans*g[i];
        printf("%d",ans.a[s][t]);
    }
    View Code
  • 相关阅读:
    java — 排序算法
    sping框架(3)— 使用spring容器
    java — 线程池
    一致性哈希算法(consistent hashing)
    linux进程调度
    滑动窗口协议
    final和static关键字
    II 3.1 连接到服务器
    intel-hadoop/HiBench流程分析----以贝叶斯算法为例
    Android开发学习之路--基于vitamio的视频播放器(二)
  • 原文地址:https://www.cnblogs.com/lishiyao/p/6662013.html
Copyright © 2011-2022 走看看