Description
在《炉石传说》这款游戏中,有一张随从卡牌叫做“恐怖的奴隶主”。这张卡牌的描述是这样的:每当该随从受到伤害且没有死亡,召唤另一个恐怖的奴隶主。还有一张卡牌叫做“旋风斩”,描述是“对所有随从造成1点伤害”。使用“旋风斩”后,生命值变为0的“恐怖的奴隶主”并不会立即死亡,而会先结算召唤新的“恐怖的奴隶主”再结算生命值为0的“恐怖的奴隶主”的死亡。当然,使用旋风斩后,生命值变为0的“恐怖的奴隶主”不会召唤新的“恐怖的奴隶主”。随从的数量是有上限的,在召唤一个随从前如果随从数量已经达到上限则不会召唤。现在,如果随从数量上限为k,最开始只有一个生命值为m的“恐怖的奴隶主”,而且新召唤出来的“恐怖的奴隶主”的生命值也是m,那么使用了n张“旋风斩”后还有多少个“恐怖的奴隶主”呢?
Sample Input
4 3 7
Sample Output
6
【样例说明】
初始有1个生命值为3的“恐怖的奴隶主”。
第1次旋风斩后,召唤了1个“恐怖的奴隶主”,剩余1个生命值为2的和1个生命值为3的。
第2次旋风斩后,召唤了2个“恐怖的奴隶主”,剩余1个生命值为1的、1个生命值为2的和2个生命值为3的。
第3次旋风斩后,召唤了3个“恐怖的奴隶主”,然后1个生命值为0的死亡,剩余1个生命值为1的、2个生命值为2的和3个生命值为3的。
第4次旋风斩后,试图召唤5个“恐怖的奴隶主”,但随从数量达到上限7,所以只召唤了1个,然后其中1个生命值为0的死亡,最后剩余2个生命值为1的、3个生命值为2的和1个生命值为3的,共6个。
Data Constraint
对于10%的数据,n,k<=10^3;
另有15%的数据,n,m<=10^5;
另有25%的数据,m<=10^5;
另有20%的数据,10^8<=n,m,k<=10^9;
对于全部数据,n,m,k<=10^15。
分析
这题的正解是找规律,没错!就是找规律,我刚看到题解是也很意外(我还以为是矩阵乘法)
我们先来想个部分分算法:
我们很容易就想到用一个数组来存人数,用一个指针来指向满血和0血的分界线,
每次都把在场的每个人血量减一,那么就等于把指针移动一位,这样每个人的血量减了一,移动后腾出的一位就放当前满血的人数。
数组+滚动指针:25分
我们还可以证明一定会有一堆连续的0,不为0的状态一定很少,所以可以把这堆0压缩
加上这个优化还可以水点分
正解为找出循环节再计算答案
循环节???什么鬼!!!
来来来,我们先来模拟一下样例:
轮数\此血量的人数 | 0 | 1 | 2 | 3 | 活的人数 |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 2 |
2 | 0 | 1 | 1 | 2 | 4 |
3 | 1 | 1 | 2 | 3 | 6 |
4 | 1 | 2 | 3 | 1 | 6 |
5 | 2 | 3 | 1 | 1 | 5 |
6 | 3 | 1 | 1 | 2 | 4 |
7 | 1 | 1 | 2 | 3 | 6 |
发现了什么??? Someting Special???
我们发现当k被填满时,循环节就出现了,而且长度必须是(m+1),证明显然
这下n就可以直接变成n=n mod(m+1)了,
这时,
ans=ans总−(血为0的人数)
,血为0的人数就是mod以后当前场上血量为n的人数(注意算上压缩的0).
SO,
AC,收工!