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 }
原文地址:https://www.cnblogs.com/dsanying/p/11329491.html