1. 程式人生 > >【hdu】【P2157】【How many ways??】【題解】【矩陣乘法】

【hdu】【P2157】【How many ways??】【題解】【矩陣乘法】

傳送門:acm.hdu.edu.cn/showproblem.php?pid=2157

矩乘經典應用

Code:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=21;
const int MOD=1000;
int n,m;
struct Matrix{
		int a[maxn][maxn];
		void clear(){
			memset(a,0,sizeof(a));
		}
		void init(int n){
			for(int i=0;i<n;i++)a[i][i]=1;
		}
		int at(int i,int j){
			return a[i][j];
		}
		void updata(int i,int j,int x){
			a[i][j]=x;
		}
		Matrix operator*(Matrix x)const{
			Matrix ans;
			ans.clear();	
			for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
			for(int k=0;k<n;k++)	
			ans.a[i][j]+=a[i][k]*x.a[k][j],
			ans.a[i][j]%=MOD;
			return ans;
		}
		Matrix operator%(int p){
			Matrix ans=*this;
			for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
			a[i][j]%=p;
			return ans;
		}
};
Matrix pow(Matrix x,int k){
	Matrix ans;
	ans.clear();
	ans.init(n);
	for(;k;k>>=1){
		if(k&1)ans=(ans*x)%MOD;
		x=(x*x)%MOD;
	}return ans;
}
Matrix mp;
int main(){
	while(scanf("%d%d",&n,&m)==2){
		mp.clear();
		if(!n&&!m)break;
		for(int i=1;i<=m;i++){
			int u,v;scanf("%d%d",&u,&v);
			mp.updata(u,v,1);
		}
		int T;scanf("%d",&T);
		while(T--){
			int u,v,k;scanf("%d%d%d",&u,&v,&k);
			Matrix ans=pow(mp,k);
			printf("%d\n",ans.at(u,v)%MOD);
		}
	}
	return 0;
}