比赛 |
20251001国庆欢乐赛1 |
评测结果 |
AAAAAATTTT |
题目名称 |
信使 |
最终得分 |
60 |
用户昵称 |
123 |
运行时间 |
23.038 s |
代码语言 |
C++ |
内存使用 |
3.97 MiB |
提交时间 |
2025-10-01 11:54:34 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=110,M=55;
int n,m,x,y,q,u,v,d;
long long f[N][N],g[N][N],k[N][N],mod;
int main() {
freopen("messenger.in","r",stdin);
freopen("messenger.out","w",stdout);
cin>>n>>m>>mod;
while (m--) scanf("%d%d",&x,&y),k[x][y]=1;
cin>>q;
while (q--)
{
scanf("%d%d%d",&u,&v,&d);
if (d==1)
{
printf("%d\n",k[u][v]);
}
else if (d==2)
{
long long ret=0;
for (int i=1;i<=n;i++)
{
if (i!=u && i!=v) ret=(ret+(k[u][i] && k[i][v]))%mod;
}
printf("%lld\n",ret);
}
else
{
memset(g,0,sizeof(g));
memset(f,0,sizeof(f));
d-=3;
for (int i=1;i<=n;i++)
{
if (i!=u && i!=v && k[u][i])
{
for (int j=1;j<=n;j++)
{
if (j!=u && j!=v)
{
f[i][j]=k[i][j];
}
}
}
}
while (d)
{
memset(g,0,sizeof(g));
for (int r=1;r<=n;r++)
{
if (r==u || r==v) continue;
for (int i=1;i<=n;i++)
{
if (i==u || i==v) continue;
for (int j=1;j<=n;j++)
{
if (j==u || j==v) continue;
g[i][j]=(g[i][j]+f[i][r]*k[r][j]%mod)%mod;
}
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++) f[i][j]=g[i][j];
}
d--;
// for (int i=1;i<=n;i++)
// {
// for (int j=1;j<=n;j++) cout<<f[i][j]<<" ";
// cout<<endl;
// }
}
long long ret=0;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
if (i!=u && i!=v && j!=u && j!=v) ret=(ret+(k[u][i] && k[j][v])*f[i][j]%mod)%mod;
}
}
printf("%lld\n",ret);
}
}
}