zoukankan      html  css  js  c++  java
  • BZOJ 1297: [SCOI2009]迷路 [矩阵快速幂]

    Description

    windy在有向图中迷路了。 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1。 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。

    Input

    第一行包含两个整数,N T。 接下来有 N 行,每行一个长度为 N 的字符串。 第i行第j列为'0'表示从节点i到节点j没有边。 为'1'到'9'表示从节点i到节点j需要耗费的时间。

    Output

    包含一个整数,可能的路径数,这个数可能很大,只需输出这个数除以2009的余数。

    Sample Input

    【输入样例一】
    2 2
    11
    00

    【输入样例二】
    5 30
    12045
    07105
    47805
    12024
    12345


    Sample Output

    【输出样例一】
    1

    【样例解释一】
    0->0->1

    【输出样例二】
    852

    HINT

    30%的数据,满足 2 <= N <= 5 ; 1 <= T <= 30 。
    100%的数据,满足 2 <= N <= 10 ; 1 <= T <= 1000000000 。

    思路:矩阵快速幂应该是第一个能想到的,但是直接将一个长为9的边拆成9个点,那最坏情况下就有9*9*9个点约等于700多个点,时间复杂度是n*n*n*log(t)前面显然会爆,但是可以这样,把一个点拆成9个点,9个点连成一条链,这样就可以乱搞了,如果一个点x到这个点y有长度为k的边 只要将x连到y前面k-1个点就行(因为连出一条边就减少了一条边)

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #define N 90
     5 #define MOD 2009
     6 using namespace std;
     7 char ch[100][100];
     8 struct mat
     9 {
    10     long long m[N+1][N+1];
    11     mat(){memset(m,0,sizeof(m));}
    12 };
    13 mat operator *(mat a,mat b)
    14 {
    15     mat ans;
    16     for(int i=1;i<=N;i++)
    17     {
    18         for(int j=1;j<=N;j++)
    19         {
    20             for(int k=1;k<=N;k++)
    21             {
    22                 ans.m[i][j] = (ans.m[i][j] + a.m[i][k] * b.m[k][j])% MOD;
    23             }
    24         }
    25     }
    26     return ans;
    27 }
    28 mat pow(mat a,long long n)
    29 {
    30     mat ret;
    31     for(int i=1;i<=N;i++)ret.m[i][i]=1;
    32     for(;n;n>>=1)
    33     {
    34         if(n&1)ret = (ret * a);
    35         a = (a*a);
    36     }
    37     return ret;
    38 }
    39 int main()
    40 {
    41     int n,t;
    42     mat a;
    43     scanf("%d%d",&n,&t);
    44     for(int i=1;i<=n;i++)
    45     {
    46         scanf("%s",ch[i]+1);
    47     }
    48     for(int i=1;i<=n;i++)
    49     {
    50         for(int j=1;j<=8;j++)
    51         {
    52             a.m[(i-1)*9+j][(i-1)*9+j+1]=1;
    53         }
    54     }
    55     for(int i=1;i<=n;i++)
    56     {
    57         for(int j=1;j<=n;j++)
    58         {
    59             int u = ch[i][j]-'0';
    60             if(u!=0)
    61             {
    62                 a.m[(i-1)*9+9][(j-1)*9+(9-u+1)]=1;
    63             }
    64         }
    65     }
    66     a = pow(a,t);
    67     printf("%lld
    ",a.m[9][(n-1)*9+9]);
    68     return 0;
    69 }
  • 相关阅读:
    日历表 --- 2020年日历表免费高清打印横版(完美适配A4全年一页)
    通过Apache Hudi和Alluxio建设高性能数据湖
    Apache Hudi初学者指南
    使用Apache Hudi + Amazon S3 + Amazon EMR + AWS DMS构建数据湖
    印度最大在线食品杂货公司Grofers的数据湖建设之路
    Apache Hudi助力nClouds加速数据交付
    xcrun上传ios包到苹果审核,报错Cannot proceed with delivery: an existing transporter instance is currently uploading this package
    Error: No named parameter with the name 'shadowThemeOnly'.
    MyBatis操作Oracle的时候,传入null值而引发的错误
    Oracle 修改字符集 SIMPLIFIED CHINESE_CHINA.AL32UTF8
  • 原文地址:https://www.cnblogs.com/philippica/p/4700637.html
Copyright © 2011-2022 走看看