可以翻看离散课本。无向图的邻接矩阵
An,有性质:从i到j长度为n的路径有
aij条
#include<bits/stdc++.h>
using namespace std;
const int N=210;
const int mod=1e9+7;
int Q,n,m;
int read(int &n){
n=0;int w=-1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') {w=-1;}ch=getchar();}
while(ch>='0'&&ch<='9'){ n=n*10+ch-'0';ch=getchar();}
return n*w;
}
struct maxtri{
int v[N][N],n;
void init(){
memset(v,0,sizeof v);
for(int i=0;i<N;++i) v[i][i]=1;
}
};
maxtri maxtriE;
maxtri mul(maxtri mt1,maxtri mt2){
maxtri tmp;
memset(tmp.v,0,sizeof tmp.v);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
for(int k=1;k<=n;++k){
tmp.v[i][j] =(tmp.v[i][j]+1ll*mt1.v[i][k]*mt2.v[k][j]%mod)%mod;
}
}
}
return tmp;
}
void quickPow(maxtri maxtriA,int p){
maxtri tmp=maxtriA;
maxtri ans;ans.init();
while(p){
if(p&1){
ans=mul(ans,tmp);
}
tmp=mul(tmp,tmp);
p>>=1;
}
while(Q--){
int u,v;
read(u);read(v);
printf("%d\n",ans.v[u][v]);
}
}
maxtri g;
int main(){
read(Q);read(n);read(m);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
read(g.v[i][j]);
}
}
quickPow(g,m);
return 0;
}