@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@

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. const int MAXN = 300;
  5. const int MAXS = MAXN*MAXN;
  6. const int MOD = int(1E9) + 7;
  7. inline int add(int x, int y) {return (x + y) % MOD;}
  8. inline int mul(int x, int y) {return 1LL*x*y % MOD;}
  9. inline int sub(int x, int y) {return add(x, MOD-y);}
  10. int pow_mod(int b, int p) {
  11. int ret = 1;
  12. for(int i=p;i;i>>=1,b=mul(b,b))
  13. if( i & 1 ) ret = mul(ret, b);
  14. return ret;
  15. }
  16. int l[MAXN + 5], d, s, S;
  17. int fct[2*MAXN + 5], ifct[2*MAXN + 5];
  18. int comb(int n, int m) {
  19. return mul(fct[n], mul(ifct[m], ifct[n-m]));
  20. }
  21. int f[MAXN + 5];
  22. void init() {
  23. fct[0] = 1;
  24. for(int i=1;i<=2*d;i++)
  25. fct[i] = mul(fct[i-1], i);
  26. ifct[2*d] = pow_mod(fct[2*d], MOD-2);
  27. for(int i=2*d-1;i>=0;i--)
  28. ifct[i] = mul(ifct[i+1], i+1);
  29. for(int i=1;i<=d;i++) {
  30. // f[i] = mul(pow_mod(i, d), ifct[d]);
  31. f[i] = pow_mod(i, d);
  32. for(int j=0;j<i;j++)
  33. f[i] = sub(f[i], mul(comb(i-j+d-1, d-1), f[j]));
  34. }
  35. }
  36. int g[MAXS + 5];
  37. int main() {
  38. scanf("%d", &d), init();
  39. for(int i=1;i<=d;i++)
  40. scanf("%d", &l[i]), l[i]--;
  41. scanf("%d", &s);
  42. g[0] = 1;
  43. for(int i=1;i<=d;i++) {
  44. S += l[i];
  45. for(int j=1;j<=S;j++) g[j] = add(g[j], g[j-1]);
  46. for(int j=S;j>l[i];j--) g[j] = sub(g[j], g[j-l[i]-1]);
  47. }
  48. int ans = 0;
  49. for(int i=0;i<=s;i++)
  50. ans = add(ans, mul(f[min(s-i,d)], g[i]));
  51. printf("%d\n", ans);
  52. }

@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. 【Redis】linux中 使用yum下载并安装redis

    1.检查是否有redis yum 源 yum install redis 2.下载fedora的epel仓库 yum install epel-release 3.安装redis数据库 yum ins ...

  2. [PHP]用PHP自己写一个基于zoomeye的api(偷懒必备quq)

    0x01 起因 因为手速慢,漏洞刷不过别人,一个个手补确实慢,所以想自己写一个api,一键抓取zoomeye的20页,然后就可以打批量了 ovo(真是太妙了!) 0x02 动工       1.抓包做 ...

  3. Pyqt5_Python运用过程中一些问题和技巧

    安装python3&pyqt5 1.         网下载python3.7安装包,安装时选择自定义安装,勾选上PIP 直接去官网上下载,一路下一步就可以了,然后将D:\Python37.D ...

  4. 符合PSR-0规范的自动加载

    PSR-0规范 命名空间必须与绝对路径一致 类名首字母必须大写 除去入口文件外,其他“.php”必须只有一个类 类文件必须自动载入,不采用include等 单一入口 1)目录结构 2)代码 入口文件i ...

  5. eatwhatApp开发实战(七)

    之前我们为app添加了读取本地数据的功能和删除的功能.本次我们来将listview上item项的触控修改为item项上单一控件的触控事件.用item项上的button来实现删除数据. 先上布局: &l ...

  6. [JavaWeb基础] 009.Struts2 上传文件

    在web开发中,我们经常遇到要把文件上传下载的功能,这篇文章旨在指导大家完成文件上传功能 1.首先我们需要一个上传文件的页面. <!--在进行文件上传时,表单提交方式一定要是post的方式, 因 ...

  7. CopyOnWriteArrayList(写入并复制) & CountDownLatch(闭锁)

    ConcurrentHashMap: ①Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能.② ConcurrentHashMap 同步容器 ...

  8. switch-case与if-else的转换

    对学会成绩大于60分的,输出合格,低于60分的输出不合格 import java.util.Scanner; public class TestSwitch3 { public static void ...

  9. IDEA 插件推荐 —— 让你写出好代码的神器!

    概述 今天介绍的插件主要是围绕编码规范的.有追求的程序员,往往都有代码洁癖,要尽量减少代码的「坏味道」. 代码静态检查是有很多种类,例如圈复杂度.重复率等.业界提供了很多静态检查的插件来识别这些不合规 ...

  10. js异步原理

    javascript引擎 javascript引擎执行时单线程的,如果有一个任务被阻塞,整个浏览器就会处于假死状态 那么遇到这种情况,又在单线程的情况下,不能像java之类的语言创建多几个线程来处理, ...