HDU5399——贪心——Too Simple

http://acm.hdu.edu.cn/showproblem.php?pid=5399

/*
先特判有重复数的情况,如果有就输出-1
如果全是数字那么就判是否符合条件
剩下的就是m!的(cout-1)次
*/
/************************************************
* Author        :Powatr
* Created Time  :2015-8-18 18:40:18
* File Name     :1004.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 1e2 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;

int b[MAXN][MAXN];
int a[MAXN][MAXN];
int c[MAXN];
ll fact(int x)
{
    ll ans = 1;
    for(int i = 1; i <= x; i++)
        ans = ans * i % MOD;
    return ans;
}
int main(){
    int n, m;
    while(~scanf("%d%d", &m, &n)){
        int cout = 0;
        for(int i = 1; i <= n; i++){
            scanf("%d", &a[i][1]);
            if(a[i][1] == -1){cout++; continue;}
            for(int j = 2; j <= m; j++)
                scanf("%d", &a[i][j]);
        }
        int flag = 0;
        for(int i = 1; i <= n; i++){
            memset(c, 0, sizeof(c));
                if(a[i][1] == -1) continue;
                for(int j = 1; j <= m; j++){
                  if(!c[a[i][j]]) c[a[i][j]] = 1;
                    else flag = 1;
                }
        }
       if(flag == 1){
          puts("0");
          continue;
       } 
       int p;
       flag = 0;
       if(cout == 0){
           for(int i = 1; i <= m; i++){
               p = i;
               for(int j = n; j >= 1; j--)
                   p = a[j][p];
               if(p!=i) flag = 1; 
           }

           if(flag == 1){
               puts("0");
               continue;
           } 
           //    for(int i = 1; i <= m; i++){
           //         printf("%d ", b[n][i]);}
           else {
               puts("1");
               continue;
           }
       }
         ll ans = 1;
         ll ret = fact(m);
        for(int i = 1; i < cout; i++){
            ans = ans * ret  % MOD;
        }
        printf("%I64d
", ans);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/zero-begin/p/4740534.html