Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits
Description
windy在有向图中迷路了。
该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1。
现在给出该有向图,你能告诉windy总共有多少种不同的路径吗?
注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。
第一行包含两个整数,N T。
接下来有 N 行,每行一个长度为 N 的字符串。
第i行第j列为’0’表示从节点i到节点j没有边。
为’1’到’9’表示从节点i到节点j需要耗费的时间。
Output
输出一个整数,可能的路径数,这个数可能很大,只需输出这个数除以2009的余数。
Sample Output
Data Constraint
Hint
100%的数据,满足 2 <= N <= 10 ; 1 <= T <= 1000000000 。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <bits/stdc++.h> using namespace std; int mod=2009; int n,t; struct pp{ int m[115][115]; }a; int c; inline pp mul(pp b,pp c) { pp t; for(int i=1;i<=10*n;i++) for(int j=1;j<=10*n;j++){ t.m[i][j]=0; for(int k=1;k<=10*n;k++){ t.m[i][j]=(t.m[i][j]+(b.m[i][k]*c.m[k][j])%mod)%mod; } } return t; } inline int fast(int x) { pp ans=a; pp base=a; while(x) { if(x&1)ans=mul(ans,base); base=mul(base,base); x=x>>1; } return ans.m[1][n]; } int main() { cin>>n>>t; for(int i=1;i<=n;i++) { for(int j=1;j<=8;j++) a.m[i+j*n][i+(j-1)*n]=1; for(int j=1;j<=n;j++) { scanf("%1d",&c); a.m[i][j+n*(c-1)]=1; } } cout<<fast(t-1); return 0; }
|
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 暗影小站! 注: 本博客暂不开设评论区,请使用邮件119548583@qq.com联系