在在线IDE和本地运行样例正常:
在评测中出现RE:“Runtime Error.
Received signal 11: Segmentation fault with invalid memory reference.”
,评测记录:R124132835
输入:
7 13 5
1 3
4 5
5 4
6 1
2 2
输出:
443723615
源代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int is_no(int no1[],int no2[],int num){//判断所传入数是否在禁止名单的“被禁止方”内
int* ans = find(no2,no2+k,num);
if(ans==no2+k){
return 0;
}else{
return no1[ans-no2];
}
}
int main(){
cin >> n >> m >>k;
int no1[k];//禁止名单的“禁止方”
int no2[k];//禁止名单的“被禁止方”
int dp[m+1][n+1];//dp
memset(no1,0,sizeof(no1));
memset(no2,0,sizeof(no2));
memset(dp,0,sizeof(dp));
for(int i = 0;i<k;i++){
cin >> no1[i] >> no2[i];
}
for(int i = 2;i<=n;i++){//第一次传球作特殊处理
if(is_no(no1,no2,i)==1){
continue;
}
dp[1][i]=1;
}
for(int i = 2;i<m;i++){//dp
for(int j = 1;j<=n;j++){//遍历每个传球方
if(j==1&&i==m-1){//当第m-1次传球时,任何人不应该将球传给1号
continue;
}
for(int p = 1;p<=n;p++){//遍历需要加的对象
if(is_no(no1,no2,j)==p||p==j){//排除两者都处在禁止名单内或自己传给自己
continue;
}
dp[i][j]+=dp[i-1][p];//增加可能数
}
}
}
for(int i = 2;i<=n;i++){//最后一次传球仅需将除1号球员的方案数全部加起来
if(is_no(no1,no2,1)==i){//排除某人不允许传给1号的情况
continue;
}
dp[m][1]+=dp[m-1][i];
}
cout << dp[m][1] % 998244353;//输出答案
return 0;
}