WA了一下午。。。。
1WA:T了,因为阶乘没打表所以时间超了。。
2WA,3WA:runtime error,检查的value数组开小了,应该是MAXN。。
4WA、5WA、6WA:改了改对cnt的处理,该加Mod的加Mod
7WA:complication error,调试函数忘了删。。
8WA:所有的int改成了long long
9WA、10WA:改了下最后的思路和对于 m = 1 的处理
11WA:加了两个*1LL
12WA、13WA:发现输入有问题,中间有-1的时候会跳出
14WA:n打成了m
15: AC
整体思路就是只要保持1 - n的每一条路是单射,只需要保证首和尾的数相同即可,不需要考虑中间过程,
特殊情况就是没有-1的时候,需要判断能不能够满足条件。
#include<stdio.h> #include<cstring> #include<set> typedef long long LL; using namespace std; ; ; long long ans; int n, m; int cnt; int a[MAXN][MAXN]; long long jc[MAXN]; int flag; set<int>s; void init(){ jc[] = ; ; i < MAXN; ++i){ jc[i] = ((jc[i-]*1LL) % MOD*i)%MOD; } } bool judge(){ ; int tmp; int value[MAXN]; ){ ; i <= n; ++i){ ][i] != i) fflag = ; } return fflag; } else{ memset(value,,sizeof(value)); ; i <= n; ++i){ tmp = a[m][i]; ; j >= ; --j){ value[i] = a[j][tmp]; tmp = a[j][tmp]; } } ; i <= n; ++i) if( value[i] != i ) fflag = ; return fflag; } } int main(){ freopen("in.txt","r",stdin); init(); while(~scanf("%d%d", &n, &m)){ flag = ; memset(a,,sizeof(a)); s.clear(); ; i <= m; i++){ ; j <= n; j++){ scanf("%d", &a[i][j]); ] == -) break; ) flag = ; s.insert(a[i][j]); } ] != -){ flag = ; } s.clear(); } ){ printf("0\n"); continue; } ans = ; cnt = ; flag = ; ; i <= m; ++i){ ] == - ){ cnt++; flag = ; } } if(cnt){ ; i < cnt; ++i){ ans =( ans *1LL* jc[n] )% MOD; } } if(flag) printf("%I64d\n",ans); else{ if(judge()) printf("1\n"); else printf("0\n"); } } }