比赛 20251001国庆欢乐赛1 评测结果 AAAAAATTTT
题目名称 信使 最终得分 60
用户昵称 wdsjl 运行时间 20.375 s
代码语言 C++ 内存使用 4.71 MiB
提交时间 2025-10-01 11:47:28
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int N = 110;

int q,g[N][N],n,m,mod,pre[N][N][N];//pre 从u到v走几步的方案数 

vector<int> adj[N]; 

int main(){
	freopen("messenger.in","r",stdin);
	freopen("messenger.out","w",stdout);
	scanf("%d%d%d",&n,&m,&mod);
	memset(g,0,sizeof(g));
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		g[u][v]=1;
		adj[u].push_back(v);
	}
	
	for(int u=1;u<=n;u++){
		for(int v=1;v<=n;v++){
			if(u==v)continue;
			
			vector <int> m_p;
			for(int i=1;i<=n;i++){
				if(i!=u&&i!=v)m_p.push_back(i);
			}
			
			pre[u][v][1]=g[u][v]%mod;
			
			int dppre[N];//初始化从u一步走到i的方案 
			
			for(int i=1;i<=n;i++){
				dppre[i]=g[u][i]%mod;
			} 
			
			for (int k = 2; k <= 50; ++k) {
                int dp_ct[N] = {0};

                for (vector<int>::iterator it = m_p.begin(); it != m_p.end(); ++it) {
                    int y = *it;
                    int val = dppre[y];
                    if (val == 0) continue;

                    for (vector<int>::iterator x_it = adj[y].begin(); x_it != adj[y].end(); ++x_it) {
                        int x = *x_it;
                        dp_ct[x] = (dp_ct[x] + val) % mod;
                    }
                }

                pre[u][v][k] = dp_ct[v] % mod;

                
                memcpy(dppre, dp_ct, sizeof(dp_ct));
            }
		}
	}
	scanf("%d",&q);
	while(q--){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		printf("%d\n",pre[x][y][z]%mod);
	} 
	return 0;
}