P13232 [GCJ 2015 #3] River Flow

题目描述

你所在的城市坐落在壮观的二进制河(Binary river)岸边。河水来自高山上的一些支流。不幸的是,山上的农民需要用这些支流的水来灌溉庄稼。 很久以前,城市与农民达成了一项协议,允许他们在保证河水流动的同时进行耕作:每位农民被允许在一半的时间里为庄稼用水。农民们轮流用一天水,然后让水流入河一天。结果却是一场灾难!因为所有农民的用水时间是同步的,要么全部用水,要么全部不取水,导致河流每隔一天就会干涸,接着第二天又会泛滥。 为了解决这个问题,城市再次与农民协商,让每位农民选择一个介于 $1$ 到 $\mathbf{D}$(包含)之间的 $2$ 的整数次幂(毕竟这是二进制河),并且每经过该天数就切换一次用水状态(即开始或停止取水)。(并不是每个 $1$ 到 $\mathbf{D}$ 之间的 $2$ 的幂都一定被选择,多个农民可以选择相同的数字。$1$ 也算作 $2$ 的幂。)这样做的目的是让整体用水更加均匀,从而减少干旱和洪水的发生。 这一切都发生在很久以前,而你和其他市民最近开始怀疑农民们并没有遵守协议。(你甚至不知道现在有多少农民!)然而,你们唯一掌握的数据是 $\mathbf{N}$ 天的河流水量历史记录。你能判断农民们是否诚实吗? 每条支流的流量为 $1$,主河道的流量等于所有未被农民取水的支流流量之和。(在查看记录之前,你并不知道有多少条支流。)每条支流最多只会被一位农民取水,也可能有些支流从未被农民取水。注意,农民们在城市开始记录水流之前就已经开始了他们的用水周期,但并不能保证他们都是在同一天开始的。

输入格式

输入的第一行是测试用例数 $\mathbf{T}$。接下来有 $\mathbf{T}$ 组测试用例。每组测试用例的第一行包含两个用空格分隔的整数 $\mathbf{N}$ 和 $\mathbf{D}$。下一行包含 $\mathbf{N}$ 个用空格分隔的整数,第 $\mathrm{i}$ 个整数 $\mathbf{d}_{\mathrm{i}}$ 表示第 $\mathrm{i}$ 天河流的流量。

输出格式

对于每组测试用例,输出一行,格式为 "Case #x: M",其中 $\mathrm{x}$ 是测试用例编号(从 $1$ 开始),$\mathbf{M}$ 是根据上述模型、与观测到的河流流量一致的最少农民数量。 如果你确定至少有一位农民在活动,但没有任何方式可以用遵守规则的农民来解释给定的输入,则输出 CHEATERS! 代替数字。

说明/提示

**样例解释** 第 1 组数据可以解释为有两条支流,没有农民从中取水。 第 2 组数据可以看作有一条支流,每隔 $4$ 天被取水一次。然而,这组数据的 $\mathbf D$ 是 $2$,所以这位农民违反了协议。 第 3 组数据可以看作有两位农民,各自的取水周期为 $4$ 天。 第 4 组数据可以看作有三位农民,取水周期分别为 $1, 2$ 和 $4$ 天。 **数据范围** - $1 \leq \mathbf{T} \leq 50$。 - $\mathbf{D}$ 是 $2$ 的幂。 - $1 \leq \mathbf{D} \leq \operatorname{floor}(\mathbf{N} / 2)$。 **小数据集(10 分)** - 时间限制:~~240~~ 5 秒。 - $1 \leq \mathbf{N} \leq 50$。 - $0 \leq \mathbf{d}_{\mathrm{i}} \leq 5$。 **大数据集(17 分)** - 时间限制:~~480~~ 10 秒。 - $1 \leq \mathbf{N} \leq 5000$。 - $0 \leq \mathbf{d}_{\mathrm{i}} \leq 1000$。 由 ChatGPT 4.1 翻译