zoukankan      html  css  js  c++  java
  • HH去散步(bzoj 1875)

    Description

    HH有个一成不变的习惯,喜欢饭后百步走。所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离。 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回。 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法。 现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径

    Input

    第一行:五个整数N,M,t,A,B。其中N表示学校里的路口的个数,M表示学校里的 路的条数,t表示HH想要散步的距离,A表示散步的出发点,而B则表示散步的终点。 接下来M行,每行一组Ai,Bi,表示从路口Ai到路口Bi有一条路。数据保证Ai ≠ Bi,但 不保证任意两个路口之间至多只有一条路相连接。 路口编号从0到N − 1。 同一行内所有数据均由一个空格隔开,行首行尾没有多余空格。没有多余空行。 答案模45989。

    Output

    一行,表示答案。

    Sample Input

    4 5 3 0 0
    0 1
    0 2
    0 3
    2 1
    3 2

    Sample Output

    4

    HINT

    对于30%的数据,N ≤ 4,M ≤ 10,t ≤ 10。 对于100%的数据,N ≤ 20,M ≤ 60,t ≤ 2^30,0 ≤ A,B

    /*
        设f[i][j]表示到达第i条边的终点,切已经走过了j条边的方案数。
        f[i][j]可转移到的状态为f[k][j+1](i的终点为k的起点)。
        然后用矩阵乘法转移。
    */
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define N 130
    #define mod 45989
    using namespace std;
    int head[N],n,m,t,A,B,cnt=1;
    struct node{int u,v,pre;}e[N];
    void add(int u,int v){
        e[++cnt].u=u;
        e[cnt].v=v;
        e[cnt].pre=head[u];
        head[u]=cnt;
    }
    struct M{
        int v[N][N];
        M(){
            memset(v,0,sizeof(v));
        }
        friend M operator*(M a,M b){
            M ans;
            for(int i=1;i<=cnt;i++)
                for(int j=1;j<=cnt;j++)
                    for(int k=1;k<=cnt;k++)
                        ans.v[i][j]=(ans.v[i][j]+(a.v[i][k]*b.v[k][j])%mod)%mod;
            return ans;
        }
        friend M operator^(M a,int b){
            M ans;
            for(int i=1;i<=cnt;i++) ans.v[i][i]=1;
            while(b){
                if(b&1) ans=ans*a;
                a=a*a;
                b>>=1;
            }
            return ans;
        }
    }a,b;
     
    int main(){
        scanf("%d%d%d%d%d",&n,&m,&t,&A,&B);
        for(int i=1;i<=m;i++){
            int u,v;scanf("%d%d",&u,&v);
            add(u,v);add(v,u);
        }
        for(int i=head[A];i;i=e[i].pre)
            a.v[1][i]++;
        for(int i=2;i<=cnt;i++)
            for(int j=2;j<=cnt;j++)
                if(e[i].v==e[j].u&&(i^1)!=j)
                    b.v[i][j]++;
        a=a*(b^(t-1));
        int tot=0;
        for(int i=head[B];i;i=e[i].pre)
            tot+=a.v[1][i^1],tot%=mod;
        printf("%d",tot);
        return 0;
    }
    
  • 相关阅读:
    Druid 使用 Kafka 将数据载入到 Kafka
    Druid 使用 Kafka 数据加载教程——下载和启动 Kafka
    Druid 集群方式部署 —— 启动服务
    Druid 集群方式部署 —— 端口调整
    Druid 集群方式部署 —— 配置调整
    Druid 集群方式部署 —— 配置 Zookeeper 连接
    Druid 集群方式部署 —— 元数据和深度存储
    Druid 集群方式部署 —— 从独立服务器部署上合并到集群的硬件配置
    Druid 集群方式部署 —— 选择硬件
    Druid 独立服务器方式部署文档
  • 原文地址:https://www.cnblogs.com/harden/p/6639534.html
Copyright © 2011-2022 走看看