#P6836. [IOI2020] 装饼干

    ID: 5982 Type: RemoteJudge 1000ms 128MiB Tried: 0 Accepted: 0 Difficulty: 6 Uploaded By: Tags>动态规划,dp2020IOI交互题Special Judge

[IOI2020] 装饼干

题目描述

Khong 阿姨在组织一场有 xx 位选手参加的竞赛,她打算给每位选手一 袋饼干。总共有 kk 种不同类型的饼干,编号为从 00k1k-1。类型为 i(0ik1)i(0 \le i \le k-1) 的每块饼干都有一个 口味值 2i2^i。在 Khong 阿姨的食品储藏室里,有 a[i]a[i](有可能为 00)块类型为 ii 的饼干。

对每种类型的饼干,Khong 阿姨在每个袋子都会装上 00 或者多块。所有袋子里面类型为 ii 的饼干的总块数不能超过 a[i]a[i]。一个袋子里面所有饼干的口味值的总和,被称为这袋饼干的 总口味值

请帮 Khong 阿姨算一下,究竟存在多少不同的 yy 值,使得她可以装出 xx 袋饼干,而且每袋饼干的总口味值都等于 yy

实现细节

你需要实现下面的这个函数:

int64 count_tastiness(int64 x, int64[] a)
  • xx:需要装的饼干袋的数量。
  • aa:长度为 kk 的数组。对 0ik10 \le i \le k-1a[i]a[i] 表示在食物储藏室里类型为 ii 的饼干数量。
  • 此函数应当返回不同 yy 值的数目,使得阿姨可以装出 xx 袋饼干,且每袋饼干的总口味值都为 yy
  • 此函数会被调用 qq 次 (对于允许的 qq 值,详见约束条件和子任务部分)。每次调用应当被看成是独立的场景。

提示

样例说明

例 1

考虑如下调用:

count_tastiness(3, [5, 2, 1])

这意味着阿姨打算装 33 袋饼干,而在食物储藏室里总共有 33 种类型的饼干:

  • 55 块类型为 00 的饼干,每块的口味值为 11
  • 22 块类型为 11 的饼干,每块的口味值为 22
  • 11 块类型为 22 的饼干,其口味值为 44

yy 能够取的值为 [0,1,2,3,4][0,1,2,3,4]。举例来说,为了装出总口味值均为 3333 袋饼干,阿姨可以这样装:

  • 一袋饼干里有 33 块类型为 00 的饼干,以及
  • 两袋饼干,其中各有一块类型为 00 的饼干和一块类型为 11 的饼干。

由于总共有 55 个可能的 yy 值,函数应当返回 55

例 2

考虑如下调用:

count_tastiness(2, [2, 1, 2])

这意味着阿姨打算装 22 袋饼干,而在食物储藏室里总共有 33 种类型的饼干:

  • 22 块类型为 00 的饼干,每块的口味值为 11
  • 11 块类型为 11 的饼干,其口味值为 22
  • 22 块类型为 22 的饼干,每块的口味值为 44

yy 能够取的值为 [0,1,2,4,5,6][0,1,2,4,5,6]。由于总共有 66 个可能的 yy 值,函数应当返回 66

约束条件

  • 1k601 \le k \le 60
  • 1q10001 \le q \le 1000
  • 1x10181 \le x \le 10^{18}
  • 0a[i]10180 \le a[i] \le 10^{18}(对于所有的 0ik10 \le i \le k-1
  • 对于 count_tastiness 的每次调用,食物储藏室里所有饼干的口味值总和都不会超过 101810^{18}

子任务

  1. (9 分) q10q \le 10,且对于 count_tastiness 的每次调用,食物储藏室里所有饼干的口味值总和都不会超过 10510^5
  2. (12 分) x=1,q10x=1,q \le 10
  3. (21 分) x104,q10x \le 10^4,q \le 10
  4. (35 分) 对于 count_tastiness 的每次调用,正确的返回结果都不会超过 2×1052 \times 10^5
  5. (23 分) 没有附加限制条件。

评测程序示例

评测程序示例将读取如下格式的输入数据。第一行包含一个整数 qq。接下来是 qq 对这样的两行:它们按照下面的格式来描述一个单独的场景:

11 ⾏:k xk\ x
22 ⾏:a[0] a[1]  a[k1]a[0]\ a[1]\ \ldots\ a[k-1]

评测程序示例的输出结果的格式如下:

ii 行 (1iq1 \le i \le q):count_tastiness 对于输入数据中第 ii 个场景的返回值。