题目:
题意:
小明喜欢旅游,没到一个地方都会搜集该地的邮票并且按照旅游的顺序收藏,他可以进行K时间的旅行,每去一个地方就要花1时间。问k时间后,小明有多少种邮票的排序方式。小明从1这个点位出发。
思路:
两点之间以边相连,不难联想到我们离散数学,离散数学当中图论求通路的数量,用到了矩阵相乘。所以,联想到矩阵快速幂!(矩阵快速幂模板题)
// Problem: D. Different Pass a Ports
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// ***********
// *Name:SWFan*
// *Time:10/08*
// ***********
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 110, mod = 1e9 + 7;
struct Matrix
{
int mat[N][N];
Matrix() {}
Matrix operator*(Matrix const &b)const
{
Matrix res;
memset(res.mat, 0, sizeof(res.mat));
for (int i = 0 ;i < N; i++)
for (int j = 0; j < N; j++)
for (int k = 0; k < N; k++)
res.mat[i][j]=(res.mat[i][j]+this->mat[i][k]*b.mat[k][j])%mod;
return res;
}
};
Matrix qmi(Matrix base, int b)
{
Matrix res;
memset(res.mat, 0, sizeof(res.mat));
for (int i = 0; i < N; i++) //qmi前初始化单位矩阵
res.mat[i][i] = 1;
while (b > 0)
{
if (b & 1) res = res * base;
base = base * base;
b >>= 1;
}
return res;
}
int n, m, b;
Matrix A;
void solve()
{
cin >> n >> m >> b;
int u, v;
while(m--)
{
cin >> u >> v;
A.mat[u][v]++;
A.mat[v][u]++;
}
Matrix ans = qmi(A, b);
int cnt = 0;
for(int i = 1; i < 110; i++)
{
cnt = (cnt + ans.mat[1][i]) % mod;
}
cout << cnt << '\n';
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T = 1;
// cin >> T;
while(T--)solve();
return 0;
}