hdoj 5399 Tpp simple

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的时候,需要判断能不能够满足条件。

hdoj 5399 Tpp simple

hdoj 5399 Tpp simple

 #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");
         }
     }
 }
上一篇:【Java每日一题】20170213


下一篇:linux 定时器编程实例(完善中).....