题目
分析
- 首先求这种方案数的图 肯定是可以用矩阵的
- 但是我们这里还有一个城市的性能限制
- 不能直接上矩阵
- 现在我们想可以先把最大的性能值跑出来
- 后面不就可以随便跑了吗
- 因为最大是70,所以直接n2不断跟新地图就好了
代码
1 #include <cmath>
2 #include <cstdio>
3 #include <cstring>
4 #include <iostream>
5 #include <algorithm>
6 #define ll long long
7 #define mod 10086
8 using namespace std;
9 int a[101],map[71][71],mp[71][71],f[71],n;
10 int ans,maxn;
11 void mul()
12 {
13 int c[71];
14 memset(c,0,sizeof(c));
15 for (int i=1;i<=n;i++)
16 for (int j=1;j<=n;j++)
17 c[i]=(c[i]+(mp[j][i]*f[j])%mod)%mod;
18 for (int i=1;i<=n;i++) f[i]=c[i];
19 }
20 void mull()
21 {
22 int c[71][71];
23 memset(c,0,sizeof(c));
24 for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) for (int k=1;k<=n;k++) c[i][j]=(c[i][j]+(mp[i][k]*mp[k][j])%mod)%mod;
25 for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) mp[i][j]=c[i][j];
26 }
27 int main()
28 {
29 int m,t;
30 scanf("%d%d%d",&n,&m,&t);
31 for (int i=1;i<=n;i++) scanf("%d",&a[i]),maxn=max(a[i],maxn);
32 for (int i=1;i<=n;i++) map[i][i]=1;
33 for (int i=1,x,y;i<=m;i++)
34 {
35 scanf("%d%d",&x,&y);
36 map[x][y]++;
37 }
38 f[1]=1;
39 for (int i=0;i<=min(t,maxn);i++)
40 {
41 for (int j=1;j<=n;j++)
42 if (a[j]==i)
43 {
44 for (int k=1;k<=n;k++)
45 mp[k][j]=map[k][j];
46 }
47 mul();
48 }
49 if (maxn>=t) {cout<<f[n];return 0;}
50 int b=t-maxn;
51 while (b)
52 {
53 if(b&1) mul();
54 b>>=1;
55 mull();
56 }
57 cout<<f[n];
58 return 0;
59 }