题目描述

有一个 n ∗ n n*n n∗n的网格,在每个格子上堆叠了一些边长为1的立方体。现在给出这个三维几何体的正视图和左视图,求有多少种与之符合的堆叠立方体的方案。两种方案被认为是不同的,当且仅当某个格子上立方体的数量不同。输出答案对 1 0 9 + 7 10^9+7 109+7取模的结果。

题解

题目其实就是问下面方程组有多少个非负整数解

∀ i ∈ [ 1 , n ] , max ⁡ j = 1 n x i , j = A i , max ⁡ j = 1 n x j , i = B i \forall i\in [1,n],\max\limits_{j=1}^n x_{i,j}=A_i,\max_{j=1}^n x_{j,i}=B_i ∀i∈[1,n],j=1maxn​xi,j​=Ai​,maxj=1n​xj,i​=Bi​

我们可以先将 A , B A,B A,B排序,这对最终答案不会有什么影响。如果 A A A的最大值不等于 B B B的最大值,则无解;否则方程一定有解。

我们可以枚举 A A A数组和 B B B数组中每一个数 s s s,找出最大值为 s s s的区域,求出该区域的方案数。

如果此时的s 为 为 为 A , B A,B A,B数组的最大值,则该区域显然是一个矩形。设这个矩形大小为 a ∗ b a*b a∗b,我们可以用容斥求解

f ( i ) = C a i ∗ ( s i ∗ ( ( s + 1 ) a − i − s a − i ) ) b f(i)=C_a^i*(s^i*((s+1)^{a-i}-s^{a-i}))^b f(i)=Cai​∗(si∗((s+1)a−i−sa−i))b

该区域的方案数为 ∑ i = 0 a = ( − 1 ) i f ( i ) \sum\limits_{i=0}^a=(-1)^if(i) i=0∑a​=(−1)if(i)

若 s s s不是 A , B A,B A,B数组的最大值,则我们要求解的区域可能是一个矩形,也可能是一个 L L L形。矩形则同上, L L L形则要重新推公式。

如果是 L L L形,则非法的只有可能是 L L L形左下方满足 a i = s a_i=s ai​=s且 b j = s b_j=s bj​=s的矩形。因为上面的行的值和右边的列的值更大,不可能非法。

设这个矩形大小为 a ∗ b a*b a∗b,上面还有 c c c行,右边还有 d d d列。先处理 ( a + c ) ∗ b (a+c)*b (a+c)∗b的矩阵,在处理 a ∗ d a*d a∗d的矩阵

则设

f [ i ] = ∑ i = 0 a C a i ∗ ( s i ∗ ( ( s + 1 ) a + c − i − s a + c − i ) ) b ∗ ( s i ∗ ( s + 1 ) a − i ) d f[i]=\sum\limits_{i=0}^a C_a^i*(s^i*((s+1)^{a+c-i}-s^{a+c-i}))^b*(s^i*(s+1)^{a-i})^d f[i]=i=0∑a​Cai​∗(si∗((s+1)a+c−i−sa+c−i))b∗(si∗(s+1)a−i)d

该区域的方案数为 ∑ i = 0 a = ( − 1 ) i f ( i ) \sum\limits_{i=0}^a=(-1)^if(i) i=0∑a​=(−1)if(i)

最后将每个区域的解相乘即为答案。

code

#include<bits/stdc++.h>
using namespace std;
int n,c1,a[100005],b[100005],c[200005];
long long ans=1,now,vk,jc[100005],ny[100005];
long long mod=1000000007;
long long mi(long long t ,long long v){if(v==0) return 1;long long re=mi(t,v/2);re=re*re%mod;if(v%2==1) re=re*t%mod;return re;
}
long long C(int x,int y){return jc[x]*ny[y]%mod*ny[x-y]%mod;
}
void pd(int a1,int b1,int c1,int d1,long long t){now=0;long long tp=1;for(int i=0;i<=a1;i++){vk=C(a1,i)*mi(mi(t,i)*((mi(t+1,a1+c1-i)-mi(t,a1+c1-i)+mod)%mod)%mod,b1)%mod;vk=vk*mi(mi(t,i)*mi(t+1,a1-i)%mod,d1)%mod;now=(now+tp*vk)%mod;now=(now+mod)%mod;tp=tp*(-1);}
}
int main()
{jc[0]=1;for(int i=1;i<=100000;i++) jc[i]=jc[i-1]*i%mod;ny[100000]=mi(jc[100000],mod-2);for(int i=99999;i>=0;i--){ny[i]=ny[i+1]*(i+1)%mod;}scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);c[++c1]=a[i];}for(int i=1;i<=n;i++){scanf("%d",&b[i]);c[++c1]=b[i];}sort(a+1,a+n+1);sort(b+1,b+n+1);sort(c+1,c+c1+1);c1=unique(c+1,c+c1+1)-c-1;if(a[n]!=b[n]){printf("0");return 0;}int l1=n+1,l2=n+1,v1=n,v2=n;for(int i=c1;i>=1;i--){while(a[v1-1]==c[i]) --v1;while(b[v2-1]==c[i]) --v2;pd(l1-v1,l2-v2,n-l1+1,n-l2+1,c[i]);ans=ans*now%mod;l1=v1;l2=v2;}printf("%lld",ans);return 0;
}

Silhouette题解相关推荐

  1. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  2. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  3. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  4. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  5. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  6. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  7. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  8. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  9. 【题解搬运】PAT_L1-009 N个数求和

    从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...

最新文章

  1. RAC -代替OC 中的代理
  2. 从Nature 封面文章“天机”芯片看脑科学与AI的融合
  3. 贝塞尔曲线与CAShapeLayer的关系以及Stroke动画
  4. Discovering versions from the identity service failed when creating the password plugin.
  5. 省选考试防爆0注意事项(PART1考试习惯)
  6. NIFI的ERROR报错信息如何清空
  7. 机器学习——人工神经网络之BP算法编程(python二分类数据集:马疝病数据集)
  8. 配置三台服务器组成的ELK集群(二)
  9. 让自己的网站变成暗黑模式
  10. TensorFlow学习笔记——TensorFlow入门
  11. uva 10755 Garbage Heap
  12. android ndk 混淆,OLLVM + NDK 混淆编译环境搭建
  13. CSS选择器之基本选择器总结
  14. mysql复制一行sql语句_MySQL复制表数据操作sql语句
  15. VB简易绘图板的实现
  16. 在网页右下角添加一个卡通动漫人物
  17. 第一章概述-------第一节--1.5 计算机网络的类别
  18. 如何更改计算机屏幕分辨率,换了显示器分辨率不对怎么办_换了电脑显示器不清晰怎么解决-win7之家...
  19. win10锁屏c语言,Win10锁屏状态怎么设置打开任意应用程序?
  20. Linux存储性能观测——vmstat命令详解

热门文章

  1. win10允许应用使用麦克风和照相机
  2. 入门力扣自学笔记150 C++ (题目编号670)
  3. LeetCode 787. K 站中转内最便宜的航班(图/Bellman Ford算法)
  4. 英语常用口语100句,建议打印保存
  5. 行为型模式(五):调停者模式
  6. conda国内源-持续更新
  7. Linux 终端命令格式
  8. WebRTC之NAT穿墙
  9. python字库转文字图片,Python输出汉字字库及将文字转换为图片
  10. SqlConnection.ConnectionTimeout 与 SqlCommand.CommandTimeout