标签:
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的时候,需要判断能不能够满足条件。
1 #include<stdio.h> 2 #include<cstring> 3 #include<set> 4 typedef long long LL; 5 using namespace std; 6 const int MAXN = 107; 7 const int MOD = 1e9+7; 8 long long ans; 9 int n, m; 10 int cnt; 11 int a[MAXN][MAXN]; 12 long long jc[MAXN]; 13 int flag; 14 set<int>s; 15 void init(){ 16 jc[0] = 1; 17 for(int i = 1; i < MAXN; ++i){ 18 jc[i] = ((jc[i-1]*1LL) % MOD*i)%MOD; 19 } 20 } 21 bool judge(){ 22 int fflag = 1; 23 int tmp; 24 int value[MAXN]; 25 if( m == 1 ){ 26 for( int i = 1; i <= n; ++i){ 27 if(a[1][i] != i) 28 fflag = 0; 29 } 30 return fflag; 31 } 32 else{ 33 memset(value,0,sizeof(value)); 34 for( int i = 1; i <= n; ++i){ 35 tmp = a[m][i]; 36 for( int j = m-1; j >= 1; --j){ 37 value[i] = a[j][tmp]; 38 tmp = a[j][tmp]; 39 } 40 } 41 for(int i = 1; i <= n; ++i) 42 if( value[i] != i ) 43 fflag = 0; 44 45 return fflag; 46 } 47 } 48 int main(){ 49 freopen("in.txt","r",stdin); 50 init(); 51 while(~scanf("%d%d", &n, &m)){ 52 flag = 0; 53 memset(a,0,sizeof(a)); 54 s.clear(); 55 for(int i = 1; i <= m; i++){ 56 for(int j = 1; j <= n; j++){ 57 scanf("%d", &a[i][j]); 58 if(a[i][1] == -1) 59 break; 60 if(a[i][j] > n || a[i][j] < 1) 61 flag = 1; 62 s.insert(a[i][j]); 63 } 64 if(s.size()!= n && a[i][1] != -1){ 65 flag = 1; 66 } 67 s.clear(); 68 } 69 if( flag == 1 ){ 70 printf("0\n"); 71 continue; 72 } 73 ans = 1; 74 cnt = 0; 75 flag = 0; 76 for(int i = 1; i <= m; ++i){ 77 if( a[i][1] == -1 ){ 78 cnt++; 79 flag = 1; 80 } 81 } 82 if(cnt){ 83 for(int i = 1; i < cnt; ++i){ 84 ans =( ans *1LL* jc[n] )% MOD; 85 } 86 } 87 if(flag) 88 printf("%I64d\n",ans); 89 else{ 90 if(judge()) 91 printf("1\n"); 92 else 93 printf("0\n"); 94 } 95 } 96 }
标签:
原文地址:http://www.cnblogs.com/blueprintf/p/4740455.html