JZOJ 3847. 都市环游(travel)
题目
分析
- 首先求这种方案数的图 肯定是可以用矩阵的
- 但是我们这里还有一个城市的性能限制
- 不能直接上矩阵
- 现在我们想可以先把最大的性能值跑出来
- 后面不就可以随便跑了吗
- 因为最大是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 }
为何要逼自己长大,去闯不该闯的荒唐