• JZ高中OJ 1036. [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
    

    Sample Output

    1
     

    Data Constraint

     
     

    Hint

    100%的数据,满足 2 <= N <= 10 ; 1 <= T <= 1000000000 。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int mod=2009;
     4 int n,t;
     5 struct pp{
     6     int m[115][115];
     7 }a;
     8 int c;
     9 inline pp mul(pp b,pp c)
    10 {
    11     pp t;
    12     for(int i=1;i<=10*n;i++)
    13     for(int j=1;j<=10*n;j++){
    14         t.m[i][j]=0;
    15         for(int k=1;k<=10*n;k++){
    16             t.m[i][j]=(t.m[i][j]+(b.m[i][k]*c.m[k][j])%mod)%mod;
    17         }
    18     }
    19     return t;
    20 }
    21 inline int fast(int x)
    22 {
    23     pp ans=a;
    24     pp base=a;
    25     while(x)
    26     {
    27         if(x&1)ans=mul(ans,base);
    28         base=mul(base,base);
    29         x=x>>1;
    30     }
    31     return ans.m[1][n];
    32 }
    33 int main()
    34 {
    35     cin>>n>>t;
    36     for(int i=1;i<=n;i++)
    37     {
    38         for(int j=1;j<=8;j++)
    39         a.m[i+j*n][i+(j-1)*n]=1;
    40         for(int j=1;j<=n;j++)
    41         {
    42             scanf("%1d",&c);
    43             a.m[i][j+n*(c-1)]=1;
    44         }
    45     }
    46     cout<<fast(t-1);  
    47     return 0;
    48 }
  • 相关阅读:
    EasyUI tab
    CC和他的AE86
    Spreading the Wealth UVA
    Ultra-QuickSort POJ
    区间完全覆盖问题(贪心)
    Mod Tree HDU
    Snakes and Ladders LightOJ
    There is no SSR CSU
    X问题 HDU
    斐波那契数列
  • 原文地址:https://www.cnblogs.com/dsanying/p/11329491.html
Copyright © 2020-2023  润新知