无法停止的计数

时间限制: 1000 ms 内存限制: 65536 kb
总通过人数: 1 总提交人数: 1

题目描述

Magry收到了个二进制计数器。忙碌而又无聊的他用这个计数器拿来数星星、数落叶、数羊、数算法上机签到人数等等等等,根本停不下来。并且这个计数器只有在显示为$2^{31}-1$的时候再数一个数计数器示数才会变为0,于是Magry也自然也不一定清楚他自从拿到这个计数器到现在一共数数数了多少,但是知道计数器现在的数值——Magry也只需要知道计数器显示的是几。

已知计数器初值为 x,一共数了 n 回,对于第 i 回的数数,Magry用这个二进制计数器数了 a[i] 个数。

求:每当Magry数一个数的时候这个二进制计数器位翻转的运行代价以及摊还代价,以及每回数数之后计数器显示的值。

其中,运行代价是指二进制计数器二进制位翻转的次数,摊还代价最好理解的方法是由势能法算出。

输入

输入只包含一组测试数据,共有n+1行。

第一行为2个整数,n 与 x,n 代表Magry一共拿这个计数器数了多少回数,x 代表在第一回数数之前计数器的初值(十进制表示)。保证$1 \leq n \leq 1000$,$0 \leq x \leq 2^{31}-1$

接下来n行,每行1个整数 a[i],表示Magry第 i 回数数数了多少。保证$1 \leq a[i] \leq 1000$

输出

输出共包含Magry的 n 回数数的数据。

对于Magry的第 i 回数数,输出下述 a[i]+2 行数据:

第一行为Case X:,X表示Magry的第 i 回数数,如Case 1: Case 2: 等等

接下来 a[i] 行,每行2个数,以一个空格分隔,对于第 j 次数数($1 \leq j \leq a[i]$),分别表示该次数数的实际运行代价k与摊还代价c。

接下来还有一行,Sum: %,其中%代表这回数数之后计数器的十进制数值(注意冒号后面的一个英文空格)。

具体参见样例。

输入样例

3 0
1
2
6

输出样例

Case 1:
1 2
Sum: 1
Case 2:
2 2
1 2
Sum: 3
Case 3:
3 2
1 2
2 2
1 2
4 2
1 2
Sum: 9

提示

数据量很大, 请不要使用std::endl输出换行以免TLE到停不下来

模拟二进制计数器递增的过程可过。大家加油(ง •_•)ง

不懂如何计算摊还代价的可参考《算法导论》中文第三版263-264页的内容

需要知道的是:势能法计算摊还代价时,需要假设势为当前状态下二进制位为1的个数

相关推荐