@description@

给定一个大小为 \(l_1\times l_2 \dots l_d\) 的 d 维超矩形,将它的一个角放置在原点,使得它的第 i 维在范围 \([0, l_i]\)。

求出这个矩形中满足 \(x_1 + x_2 + \dots + x_d \leq s\) 的点形成的体积 × d!。

原题传送门。

@solution@

首先,简单积分一下可以得到满足 \(\sum_{i=1}^{d}x_i \leq s\) 的点形成的体积为 \(\frac{s^d}{d!}\)。

因为数据都是整数,我们不妨去考虑每一个 \(1\times 1 \dots \times 1\) 的单位超矩形 \((x_1, x_2, \dots x_d) - (x_1 + 1, x_2 + 1, \dots x_d + 1)\) 的贡献。

除去完全包含(\(s - \sum_{i=1}^{d}x_i \geq d\))与完全不包含(\(s - \sum_{i=1}^{d}x_i \leq 0\)),还有 d - 1 种不完全包含的情况 (\(0 < s - \sum_{i=1}^{d}x_i < d\))。

可以作个背包 + 简单前缀和优化算出每一种情况有多少个单位超矩形。

然而不完全包含的情况并不能直接通过积分算体积。不妨仍考虑组合方法,记 \(f_j\) 表示满足 \(s - \sum_{i=1}^{d}x_i = j\) 的体积。

对于 \(\sum_{i=1}^{d}x_i \leq s\),积分出来的体积是 \(\frac{s^d}{d!}\);然而我们也可以采用单位超矩形的贡献算出体积。

不妨只考虑 s < d 的情况,则可以列出等式 \(\frac{s^d}{d!} = \sum_{i=0}^{s}{s - i + d - 1\choose d - 1}f_i\),由此就可以在 \(f_s\) 与 \(f_{0...s-1}\) 之间建立递推关系。

时间复杂度瓶颈在背包的部分,为 O(l^3)。

@accepted code@

#include <cstdio>
#include <algorithm>
using namespace std; const int MAXN = 300;
const int MAXS = MAXN*MAXN;
const int MOD = int(1E9) + 7; inline int add(int x, int y) {return (x + y) % MOD;}
inline int mul(int x, int y) {return 1LL*x*y % MOD;}
inline int sub(int x, int y) {return add(x, MOD-y);} int pow_mod(int b, int p) {
int ret = 1;
for(int i=p;i;i>>=1,b=mul(b,b))
if( i & 1 ) ret = mul(ret, b);
return ret;
} int l[MAXN + 5], d, s, S; int fct[2*MAXN + 5], ifct[2*MAXN + 5];
int comb(int n, int m) {
return mul(fct[n], mul(ifct[m], ifct[n-m]));
}
int f[MAXN + 5];
void init() {
fct[0] = 1;
for(int i=1;i<=2*d;i++)
fct[i] = mul(fct[i-1], i);
ifct[2*d] = pow_mod(fct[2*d], MOD-2);
for(int i=2*d-1;i>=0;i--)
ifct[i] = mul(ifct[i+1], i+1);
for(int i=1;i<=d;i++) {
// f[i] = mul(pow_mod(i, d), ifct[d]);
f[i] = pow_mod(i, d);
for(int j=0;j<i;j++)
f[i] = sub(f[i], mul(comb(i-j+d-1, d-1), f[j]));
}
} int g[MAXS + 5];
int main() {
scanf("%d", &d), init();
for(int i=1;i<=d;i++)
scanf("%d", &l[i]), l[i]--;
scanf("%d", &s);
g[0] = 1;
for(int i=1;i<=d;i++) {
S += l[i];
for(int j=1;j<=S;j++) g[j] = add(g[j], g[j-1]);
for(int j=S;j>l[i];j--) g[j] = sub(g[j], g[j-l[i]-1]);
}
int ans = 0;
for(int i=0;i<=s;i++)
ans = add(ans, mul(f[min(s-i,d)], g[i]));
printf("%d\n", ans);
}

@details@

一开始总以为它是一道积分题,结果发现怎么积分都不对劲。

然后尝试不从积分走而从组合数学走,发现还真能做出来。

@gym - 100958J@ Hyperrectangle的更多相关文章

  1. ACM: Gym 101047M Removing coins in Kem Kadrãn - 暴力

     Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS     Memory Limit:65536KB     64bit IO Fo ...

  2. ACM: Gym 101047K Training with Phuket's larvae - 思维题

     Gym 101047K Training with Phuket's larvae Time Limit:2000MS     Memory Limit:65536KB     64bit IO F ...

  3. ACM: Gym 101047E Escape from Ayutthaya - BFS

    Gym 101047E Escape from Ayutthaya Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I6 ...

  4. ACM: Gym 101047B Renzo and the palindromic decoration - 手速题

     Gym 101047B  Renzo and the palindromic decoration Time Limit:2000MS     Memory Limit:65536KB     64 ...

  5. Gym 101102J---Divisible Numbers(反推技巧题)

    题目链接 http://codeforces.com/gym/101102/problem/J Description standard input/output You are given an a ...

  6. Gym 100917J---Judgement(01背包+bitset)

    题目链接 http://codeforces.com/gym/100917/problem/J Description standard input/outputStatements The jury ...

  7. Gym 100917J---dir -C(RMQ--ST)

    题目链接 http://codeforces.com/gym/100917/problem/D problem description Famous Berland coder and IT mana ...

  8. Gym 101102D---Rectangles(单调栈)

    题目链接 http://codeforces.com/gym/101102/problem/D problem  description Given an R×C grid with each cel ...

  9. Gym 101102C---Bored Judge(区间最大值)

    题目链接 http://codeforces.com/gym/101102/problem/C problem description Judge Bahosain was bored at ACM ...

随机推荐

  1. chosen.jquery.min.js select2.js 弊端

    chosen.jquery.min.js --将select放在页面最下方,会导致页面高度增加,最下方空白多出来 select2.js --点击select 但未选择,然后移出鼠标,发现其他文本框.关 ...

  2. hdu4746莫比乌斯反演进阶题

    Mophues Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327670/327670 K (Java/Others)Total S ...

  3. 官网下载Java连接MySql驱动jar包

    官网地址:http://dev.mysql.com/downloads/connector/ 1.选择下载驱动 2.选择下载 3.可以不登录直接下载 4.下载下来的是zip压缩包,解压之后,文件夹中有 ...

  4. html浏览器高度和宽度和其他dom获取

    1.获取网页可见区域的宽度:document.body.clientWidth ; 2.获取网页可见区域的高度:document.body.clientHeight; 3.获取 网页可见区域宽:doc ...

  5. 【数字图像处理】OpenCV中cv2.imread()与PIL中Image.open()的差别

    cv2.imread()与PIL中Image.open()两个函数都是用来读取图像,但是在使用过程存在一些差别. 1. 首先,从导入库方面看: # opencv-python import cv2 # ...

  6. 概念辨析-Description Language还是Description Library?

    https://mp.weixin.qq.com/s/p7eyD6GkniFGHrnr8t2SZQ   概念辨析-Description Language还是Description Library? ...

  7. 3. OpenCV-Python——图像梯度算法、边缘检测、图像金字塔与轮廓检测、直方图与傅里叶变换

    一.图像梯度算法 1.图像梯度-Sobel算子 dst = cv2.Sobel(src, ddepth, dx, dy, ksize) ddepth:图像的深度 dx和dy分别表示水平和竖直方向 ks ...

  8. css 段落文字换行问题

    项目中遇到的一个小问题,以前没有注意到: 超链接超出父级元素,想着给a标签加宽度但是没有效果... 后来发现两个很好用的css属性 1.word-wrap 用来控制换行 取值: (1)normal  ...

  9. Java实现 蓝桥杯 算法训练 相邻数对(暴力)

    试题 算法训练 相邻数对 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 ...

  10. Java实现 LeetCode 704 二分查找(二分法)

    704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1 ...