码迷,mamicode.com
首页 > 其他好文 > 详细

hdoj 5399 Tpp simple

时间:2015-08-18 21:05:11      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

hdoj 5399 Tpp simple

标签:

原文地址:http://www.cnblogs.com/blueprintf/p/4740455.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!