可以推出方程
f
i
,
j
=
∑
f
i
,
p
×
f
p
,
j
f_{i,j}=\sum_{}f_{i,p}×f_{p,j}
fi,j=∑fi,p×fp,j
这不是矩乘吗(
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
int n, m;
int t, a[110][110], ans[110][110];
void matrixpow()
{
int c[110][110];
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
c[i][j]=0;
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
for(int k=0; k<=n; k++)
c[i][k]=(c[i][k]+a[i][j]*ans[j][k]%2017)%2017;
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
ans[i][j]=c[i][j];
}
void matrixpow1()
{
int c[110][110];
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
c[i][j]=0;
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
for(int k=0; k<=n; k++)
c[i][k]=(c[i][k]+a[i][j]*a[j][k]%2017)%2017;
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
a[i][j]=c[i][j];
}
void qpow(int t)
{
for(int i=0; i<=n; i++)
ans[i][i]=1;
while(t)
{
if(t&1)
matrixpow();
matrixpow1();
t>>=1;
}
}
int main()
{
scanf("%d%d", &n, &m);
for(int i=1; i<=m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
a[x][y]=a[y][x]=1;
}
scanf("%d", &t);
for(int i=0; i<=n; i++)
a[i][i]=1;
for(int i=1; i<=n; i++)
a[i][0]=1;
qpow(t);
int sum=0;
for(int i=0; i<=n; i++)
sum=(sum+ans[1][i])%2017;
printf("%d", sum);
return 0;
}