首页 > 其他 > 详细

HDU2157 (水题)状态转移

时间:2020-03-15 20:07:28      阅读:82      评论:0      收藏:0      [点我收藏+]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2157

题目意思:给定0—n-1标号的图,求出s点到t点恰好经过k个点的方案数。

题目思路:状态转移。

 1 #include<iostream>
 2 #include<string.h>
 3 typedef long long ll;
 4 #define MOD 1000
 5 #define mod(x) ((x)%MOD)
 6 const int N = 22;
 7 using namespace std;
 8 struct mat{
 9     ll a[N][N];
10     mat()
11     {
12         memset(a,0,sizeof(a));
13     }
14     friend mat operator * (mat x,mat y)
15     {
16         mat ans;
17         for(int i = 0;i < N;i++)
18         {
19             for(int j = 0;j < N;j++)
20             {
21                 for(int k = 0;k < N;k++)
22                     ans.a[i][k] = mod(ans.a[i][k]+x.a[i][j] * y.a[j][k] % MOD);
23             }
24         }
25         return ans;
26     }
27     friend mat operator ^ (mat x,ll m)
28     {
29         mat unit;
30         for(int i = 0;i < N;i++) unit.a[i][i] = 1;
31         while(m)
32         {
33             if(m&1) unit = unit * x;
34             x = x * x;
35             m >>= 1;
36         }
37         return unit;
38     }
39 };
40 int main()
41 {
42     ll n,m,t,a,b,k,s,e;
43     while(cin>>n>>m)
44     {
45         if(!n&&!m) return 0;
46         mat ans,res;
47         for(int i = 1;i <= m;i++)
48         {
49             cin>>a>>b;
50             ans.a[a][b] = 1LL;
51         }
52         cin>>t;
53         while(t--)
54         {
55             ll sum = 0;
56             cin>>s>>e>>k;
57             res = ans ^ k;
58             cout<<res.a[s][e]%MOD<<endl;
59         }
60     }
61     return 0;
62 }

 

HDU2157 (水题)状态转移

原文:https://www.cnblogs.com/Mingusu/p/12499233.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!