记录编号 600213 评测结果 RRRRRRRRRR
题目名称 加法问题 最终得分 0
用户昵称 GravatarChenBp 是否通过 未通过
代码语言 C++ 运行时间 2.093 s
提交时间 2025-04-21 21:57:24 内存使用 3.09 MiB
显示代码纯文本
#include <iostream>
#include <vector>
using namespace std;

template<typename T>
struct Matrix {
	vector<vector<T>>mat;
	int n,m,mod;

	void resize(int nt,int mt){
		n=nt;
		m=mt;
		mat.resize(n);
		for(int i=0;i<n;i++)
			mat[i].resize(m);
	}

	//非const版本(支持修改元素)
	vector<T>&operator[](const int &index){
		return mat[index];
	}
	//const版本(支持const对象访问)
	const vector<T>&operator[](const int &index)const{
		return mat[index];
	}

	Matrix operator+(const Matrix &b)const{
		Matrix ans;
		if(n!=b.n||m!=b.m)return ans;
		ans.resize(n,m);
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++){
			    ans[i][j]=(*this)[i][j]+b[i][j];
			    ans[i][j]%=mod;
            }
		return ans;
	}

	Matrix operator-(const Matrix &b)const{
		Matrix ans;
		if(n!=b.n||m!=b.m)return ans;
		ans.resize(n,m);
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++){
			    ans[i][j]=(*this)[i][j]-b[i][j];
			    ans[i][j]%=mod;
            }
		return ans;
	}

	Matrix operator*(const Matrix &b)const{
		Matrix ans;
		if(m!=b.n){
			return ans;
		}
		ans.resize(n,b.m);
		for(int i=0;i<n;++i){
			for(int j=0;j<b.m;++j){
				T sum=0;
				for(int k=0;k<m;++k){
					sum+=(*this)[i][k]*b[k][j];
					sum%=mod;
				}
				ans[i][j]=sum;
			}
		}
		return ans;
	}
	Matrix operator*(const T b)const{
		Matrix ans;
		ans.resize(n,m);
		for(int i=0;i<n;++i){
			for(int j=0;j<m;++j){
				ans=(*this)[i][j]*b;
				ans%=mod;
			}
		}
		return ans;
	}
};
template <typename T>
Matrix<T> pow(const Matrix<T>& a,int b){
    Matrix<T> ans;
    if(a.n!=a.m) return ans;
    if(b==1) return a;
    ans=pow(a,b/2);
    if(b&1) return ans*ans*a;
    else return ans*ans;
}
int main(){
	while(true){
	    int n,m;
	    cin>>n>>m;
	    if(n*m==0) return 0;
	    Matrix <int>ma;
	    ma.resize(n+1,n+1);
	    ma.mod=1000;
	    for(int i=1;i<=m;i++){
	        int s,t;
	        cin>>s>>t;
	        ma[s][t]=1;
        }
        int t;
        cin>>t;
        while(t--){
            int a,b,k;
            cin>>a>>b>>k;
            cout<<pow(ma,k-1)[a][b]<<endl;
        }
    }
	return 0;
}