Statistical number of paths - Fast matrix power

Portal: Games

We can look at discrete textbooks. Undirected graph adjacency matrix A n A^n , the nature: from i to j path has a length n a a ijArticle

#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;
}

Published 96 original articles · won praise 11 · views 2277

Guess you like

Origin blog.csdn.net/weixin_43769146/article/details/103387217