#P16170. [Ncpc2023]周期性预约Aperiodic Appointments

[Ncpc2023]周期性预约Aperiodic Appointments

题目描述

Nick 一直很难坚持习惯。问题在于,他一旦连续做某件事 KK 次,就会不得不一直做下去。

幸运的是,他开始去看 Patternson 医生。Patternson 医生是 PBT(Pattern Breaking Therapy,打破模式疗法)专家。PBT 的原则很简单:Nick 每天都去看医生;如果在某次就诊时,他已经连续 KK 次做了同一件事,医生就会向他收费。这会激励 Nick 不要继续维持这个习惯。

PBT 对 Nick 很有效,他已经成功戒掉了所有习惯。除了一个:去看 Patternson 医生的习惯。频繁就诊开始影响 Nick 的经济状况,因此你需要计算接下来 NN 天里,他需要向医生付钱多少次。

形式化地,令 s=s1s2s3sNs=s_1s_2s_3\dots s_N 为一个只含 01 的字符串。若 si=1s_i=1,表示 Nick 在第 ii 天需要付钱。字符串按如下规则逐字符生成:

  1. iKi\le K,则 si=0s_i=0
  2. i>Ki>K,考虑此前已经生成的字符串 s=s1s2si1s'=s_1s_2\dots s_{i-1}。如果存在一个非空字符串 tt,使得 ss' 的最后 tK|t|\cdot K 个字符可以写成 t+t++tt+t+\dots+t(共重复 KK 次),则 si=1s_i=1;否则 si=0s_i=0

给定 N,KN,K,请计算字符串 ss1 的个数。

上图表示样例 1。愤怒表情表示 Nick 在对应天数需要付钱。

输入格式

输入一行两个整数 N,KN,K

1N109,2K1091\le N\le 10^9,\qquad 2\le K\le 10^9

输出格式

输出一个整数,表示字符串 ss1 的个数。

输入输出样例 #1

输入 #1

7 2

输出 #1

3

输入输出样例 #2

输入 #2

99 5

输出 #2

19