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

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

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

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

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int mod = 1e9 + ;
long long n, m,a[],b[],x,y;
long long ans = ,c[][]; void init()
{
c[][] = ;
for (int i = ; i <= ; i++)
{
c[i][] = ;
for (int j = ; j <= ; j++)
c[i][j] = (c[i - ][j] + c[i - ][j - ]) % mod;
}
} long long qpow(long long a, long long b)
{
long long res = ;
while (b)
{
if (b & )
res = (res * a) % mod;
b >>= ;
a = (a * a) % mod;
}
return res;
} long long cal(long long x, long long y, long long nx, long long ny, int p)
{
long long res = ;
for (long long i = ; i <= nx; i++)
for (long long j = ; j <= ny; j++)
{
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;
if ((i + j) & )
res = ((res - temp) % mod + mod) % mod;
else
{
res += temp;
while (res >= mod)
res -= mod;
}
}
return res;
} int main()
{
scanf("%lld%lld", &n, &m);
for (int i = ; i <= n; i++)
{
long long x;
scanf("%lld", &x);
a[x]++;
}
for (int i = ; i <= m; i++)
{
long long x;
scanf("%lld", &x);
b[x]++;
}
init();
for (int i = ; i >= ; i--)
if (a[i] || b[i])
{
x += a[i];
y += b[i];
ans = ans * cal(x, y, a[i], b[i],i) % mod;
}
printf("%lld\n", ans); return ;
}

清北学堂模拟赛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. 常见的几种异常类型Exception

    转自:https://blog.csdn.net/niceworkgogogo/article/details/71746208 算数异常类:ArithmeticExecption 空指针异常类型:N ...

  2. 67.员工职位变动js

    1.员工职位jsp <%@ page language="java" import="java.util.*" pageEncoding="UT ...

  3. javascript的鼠标事件---基础

  4. P2924 [USACO08DEC]大栅栏Largest Fence

    传送门 反正我是看不出来这题和凸包有什么关系--大佬们是怎么想到的-- 不准确一点的说,本题就是要我们求一个边上点数最多的凸包 我们可以先把所有的边都取出来,然后按极角排序.枚举这个凸包的起点,然后做 ...

  5. RocketMQ(1)--helloworld

    双Master方式: 服务器环境 序号 IP 角色 模式 1 192.168.32.135 nameServer1,brokerServer1  Master1 2 192.168.32.136 na ...

  6. Django 内容回顾

    模板 变量 {{ }} 标签 {% %} if elif else for empty forloop() with...as csrf_token 过滤器 default length add da ...

  7. 如何用putty链接服务器端,并安装wdcp

    首先把自己阿里云的磁盘格式化然后重启 自己下载一个PuTTY 打开后输入自己的Ip地址端口号默认是22 会跳出一个yes 跟no界面,点击yes 会进入一个类似cmd界面 直接输入root,然后会提示 ...

  8. CSS——盒子居中显示

    嵌套中个的子盒子使用了绝对定位,父盒子使用了相对定位.那么子盒子如何居中显示: 1.距离左偏离50% 2.margin-right子盒子宽度的一半 <!DOCTYPE html> < ...

  9. Lazarus 1.6 增加了新的窗体编辑器——Sparta_DockedFormEditor.ipk

    一下是该控件官网的介绍 "Hello A package for a docked form editor can be found in : components/sparta/docke ...

  10. (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务

    http://blog.csdn.net/zixiao217/article/details/53044890 读完第一节,我们已经对Quartz有了一个大体的认识,它可以定时帮我们执行一些处理程序, ...