JZ高中OJ 1036. [SCOI2009]迷路

Posted anbujingying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 

以上是关于JZ高中OJ 1036. [SCOI2009]迷路的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ 1297][SCOI2009]迷路

矩阵快速幂bzoj1297 [SCOI2009]迷路

bzoj1297 / P4159 [SCOI2009]迷路

P4159 [SCOI2009] 迷路

[SCOI2009]迷路

[SCOI2009] 迷路(dp+矩阵快速幂)