分析:一开始拿到这道题真的是无从下手,暴力都很难打出来.但是基本的方向还是要有的,题目问的是方案数,dp不行就考虑数学方法.接下来比较难想.其实对于每一行或者每一列,我们任意打乱顺序其实对答案是没有影响的.那么我们按照高度从大到小对行和列进行排序,单独考虑所有高度相等的行和列,组成了一个L形,如果我们把所有的L形的方案数求出来最后乘起来就是答案了,关键就是怎么求它的方案数.

要求L形中满足每行每列最大高度不超过H的方案数很难求,因为不好保证最大高度,正难则反,先求出不满足的,但是不满足的也比较难求,我们就先求出有一行不满足的,一列不满足的,然后求出两行不满足的,两列不满足的,这其实就是一个容斥原理,处于限制的行和列由于取的数小于H,所以每一位能取H个数,而没有限制的可以取0~H,共H+1个数,那么方案数就出来了:H^(限制的面积) + (H+1)^(没有限制的面积)* (-1)^|S|,就像下面一个图:

蓝色部分没有限制,黑色部分有限制,黑色部分和蓝色部分组成了一个L形.

正难则反,如果求满足某某条件很难,就求出不满足某某条件的,如果还是很难,就分解一下,利用容斥原理来做.

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. const int mod = 1e9 + ;
  9. long long n, m,a[],b[],x,y;
  10. long long ans = ,c[][];
  11.  
  12. void init()
  13. {
  14. c[][] = ;
  15. for (int i = ; i <= ; i++)
  16. {
  17. c[i][] = ;
  18. for (int j = ; j <= ; j++)
  19. c[i][j] = (c[i - ][j] + c[i - ][j - ]) % mod;
  20. }
  21. }
  22.  
  23. long long qpow(long long a, long long b)
  24. {
  25. long long res = ;
  26. while (b)
  27. {
  28. if (b & )
  29. res = (res * a) % mod;
  30. b >>= ;
  31. a = (a * a) % mod;
  32. }
  33. return res;
  34. }
  35.  
  36. long long cal(long long x, long long y, long long nx, long long ny, int p)
  37. {
  38. long long res = ;
  39. for (long long i = ; i <= nx; i++)
  40. for (long long j = ; j <= ny; j++)
  41. {
  42. long long temp = qpow(p, x * y - (x - i) * (y - j)) * qpow(p + , (x - i) * (y - j) - (x - nx) * (y - ny)) % mod * c[nx][i] % mod * c[ny][j] % mod;
  43. if ((i + j) & )
  44. res = ((res - temp) % mod + mod) % mod;
  45. else
  46. {
  47. res += temp;
  48. while (res >= mod)
  49. res -= mod;
  50. }
  51. }
  52. return res;
  53. }
  54.  
  55. int main()
  56. {
  57. scanf("%lld%lld", &n, &m);
  58. for (int i = ; i <= n; i++)
  59. {
  60. long long x;
  61. scanf("%lld", &x);
  62. a[x]++;
  63. }
  64. for (int i = ; i <= m; i++)
  65. {
  66. long long x;
  67. scanf("%lld", &x);
  68. b[x]++;
  69. }
  70. init();
  71. for (int i = ; i >= ; i--)
  72. if (a[i] || b[i])
  73. {
  74. x += a[i];
  75. y += b[i];
  76. ans = ans * cal(x, y, a[i], b[i],i) % mod;
  77. }
  78. printf("%lld\n", ans);
  79.  
  80. return ;
  81. }

清北学堂模拟赛d3t3 c的更多相关文章

  1. 清北学堂模拟赛day7 数字碰撞

    /* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...

  2. 清北学堂模拟赛d4t1 a

    分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...

  3. 清北学堂模拟赛day7 错排问题

    /* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...

  4. 清北学堂模拟赛day7 石子合并加强版

    /* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ...

  5. 清北学堂模拟赛d6t6 棋盘迷宫

    3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...

  6. 清北学堂模拟赛d1t2 火柴棒 (stick)

    题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...

  7. 清北学堂模拟赛d1t1 位运算1(bit)

    题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...

  8. 清北学堂模拟赛d2t6 分糖果(candy)

    题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果 ...

  9. 清北学堂模拟赛d2t5 吃东西(eat)

    题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...

随机推荐

  1. MSP430:管脚的第二功能选择

    之前在使用PWM,AD时候用到过第二功能,不过都是copy没有注意过PXSEL究竟怎么设置,今天在设置晶振管脚时候遇到了麻烦,细致看了一下其实很简单,在SPEC的最后详细讲了每个管脚如何设置为其他功能 ...

  2. Linux扩展正则表达式

    1. 扩展正则表达式 1.1 +(加号) + 表示前一个字符出现1次或1次以上 1.1.1 理解+ 要求:取出文件内容连续出现的小写字母 [root@oldboyedu50-lnb /oldboy]# ...

  3. 数值分析常见算法C++实现

    1.1-有效数字丢失现象观察 #include<bits./stdc++.h> using namespace std; double f1(double x) { )-sqrt(x)); ...

  4. Gym - 102059D 2018-2019 XIX Open Cup, Grand Prix of Korea D. Dumae 贪心+堆

    题面 题意:有3e5个人排成一列,然后Li,Ri表示每个人可以站在[Li,Ri]中的一个,然后M(1e6)个限制条件,某个人一定要在某个人前面,求一种合法方案,无解输出-1 题解:首先可以想到对于限制 ...

  5. [Swift通天遁地]八、媒体与动画-(13)CoreText框架实现图文混排

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. 《Akka应用模式:分布式应用程序设计实践指南》读书笔记9

    性能 这也是一个比较大的问题,因为性能不一定是Akka本身的问题,还可能是你代码写的有问题. 优化的第一步就是找出性能的瓶颈,隔离出应用程序里面比较耗时的部分,然后尝试对其优化,减少需要耗费的时间成本 ...

  7. leetCode----day01---- 从排序数组中删除重复项

    需求: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...

  8. 普通平衡树代码。。。Treap

    应一些人之邀...发一篇代码 #include <iostream> #include <cstdio> #include <cstdlib> #include & ...

  9. 题解报告:hihoCoder #1175:拓扑排序·二

    题目链接:https://hihocoder.com/problemset/problem/1175 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学 ...

  10. 2CSS层叠规则(即引入CSS的三种不同方式的优先级)

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...