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

构造 HDOJ 5399 Too Simple

时间:2015-08-19 11:06:58      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:

 

题目传送门

  1. /* 
  2.     题意:首先我是懂了的,然后我觉得很难讲清楚就懒得写了,关键理解f1(f2(fm(i)))=i,不懂的戳这里 
  3.     构造:如果fi(j)不是一一映射到(1~n),重复或者不在范围内的肯定无解,还有没有-1的情况,模拟一下若不能满足f1(f2(fm(i)))=i 
  4.             也是不行的。除此之外,那么有k个-1,那么方案数是(n!) ^ (k - 1),因为k-1个可以随便排列,最后一个由于之前的确定 
  5. */  
  6. /************************************************ 
  7. * Author        :Running_Time 
  8. * Created Time  :2015-8-18 16:01:25 
  9. * File Name     :D.cpp 
  10.  ************************************************/  
  11.   
  12. #include <cstdio>  
  13. #include <algorithm>  
  14. #include <iostream>  
  15. #include <sstream>  
  16. #include <cstring>  
  17. #include <cmath>  
  18. #include <string>  
  19. #include <vector>  
  20. #include <queue>  
  21. #include <deque>  
  22. #include <stack>  
  23. #include <list>  
  24. #include <map>  
  25. #include <set>  
  26. #include <bitset>  
  27. #include <cstdlib>  
  28. #include <ctime>  
  29. using namespace std;  
  30.   
  31. #define lson l, mid, rt << 1  
  32. #define rson mid + 1, r, rt << 1 | 1  
  33. typedef long long ll;  
  34. const int MAXN = 1e2 + 10;  
  35. const int INF = 0x3f3f3f3f;  
  36. const int MOD = 1e9 + 7;  
  37. int a[MAXN][MAXN];  
  38. bool vis[MAXN];  
  39. ll f[MAXN];  
  40.   
  41. int main(void)    {     //HDOJ 5399 Too Simple  
  42.     int n, m;   f[1] = 1;  
  43.     for (int i=2; i<=100; ++i)  f[i] = f[i-1] * i % MOD;  
  44.     while (scanf ("%d%d", &n, &m) == 2) {  
  45.         int cnt = 0;    bool flag = true;  
  46.         for (int i=1; i<=m; ++i)    {  
  47.             scanf ("%d", &a[i][1]);  
  48.             if (a[i][1] == -1)  {  
  49.                 cnt++;  continue;  
  50.             }  
  51.             memset (vis, falsesizeof (vis));  
  52.             vis[a[i][1]] = true;  
  53.             for (int j=2; j<=n; ++j)    {  
  54.                 scanf ("%d", &a[i][j]);  
  55.                 if (vis[a[i][j]])   flag = false;  
  56.                 else    vis[a[i][j]] = true;  
  57.             }  
  58.         }  
  59.   
  60.         if (cnt == 0)   {  
  61.             for (int i=1; i<=n && flag; ++i)    {  
  62.                 int p = i;  
  63.                 for (int j=m; j>=1; --j)    p = a[j][p];  
  64.                 if (p != i) flag = false;  
  65.             }  
  66.         }  
  67.         if (!flag)   {  
  68.             puts ("0"); continue;  
  69.         }  
  70.         ll ans = 1;  
  71.         for (int i=1; i<cnt; ++i)   ans = ans * f[n] % MOD;  
  72.         printf ("%I64d\n", ans);  
  73.     }  
  74.           
  75.     return 0;  
  76. }  

构造 HDOJ 5399 Too Simple

标签:

原文地址:http://www.cnblogs.com/Running-Time/p/4741433.html

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