记录编号 584935 评测结果 AAAAAAAAAA
题目名称 信使 最终得分 100
用户昵称 Gravatar宇战 是否通过 通过
代码语言 C++ 运行时间 8.521 s
提交时间 2023-11-17 07:33:26 内存使用 14.74 MiB
显示代码纯文本
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;    
    ll n,m,s,z,ans=0,flag=0;
    ll e[110][110];
    ll f[110][110][55],g[110][110][55],h[110][110][55];
    int main(){
        freopen("messenger.in","r",stdin);
        freopen("messenger.out","w",stdout);
          cin>>n>>m>>z;
          for(int i=1;i<=m;i++){
              int a,b;
              cin>>a>>b;
              e[a][b]=1;
          }
          for(int i=1;i<=n;i++){
              for(int j=1;j<=n;j++){
                  if(e[i][j])f[i][j][1]=h[i][j][1]=1;
              }
          }//初始直接连接的点 
          for(int d=2;d<=50;d++){
              for(int i=1;i<=n;i++){
                  for(int j=1;j<=n;j++){
                      for(int k=1;k<=n;k++){
                          if(e[k][j])f[i][j][d]+=f[i][k][d-1];
                          f[i][j][d]%=z;
                          //dp出点i到j的方案数 
                      }
                  }
              }
          }
          for(int d=2;d<=50;d++){
              for(int i=1;i<=n;i++){
                  for(int j=1;j<=n;j++){
                      if(i==j)continue;
                      for(int k=1;k<d;k++){
                          //g和h中先存储的是不合法的方案数
                          h[i][j][d]=(h[i][j][d]+(long long)g[i][j][k]*f[i][j][d-k]+(long long)h[i][j][k]*f[j][j][d-k])%z;
                          g[i][j][d]=(g[i][j][d]+(long long)g[i][j][k]*f[i][i][d-k]+(long long)h[i][j][k]*f[j][i][d-k])%z;
                      }
                      h[i][j][d]=(f[i][j][d]-h[i][j][d]+z)%z;
                      g[i][j][d]=(f[i][i][d]-g[i][j][d]+z)%z; 
                  }
              }
          }
          int q;
          cin>>q;
          while(q--){
          int a,b,c;
          cin>>a>>b>>c;
          cout<<h[a][b][c]<<endl;          
          }
          return 0;
    }