#P0578. 向上跳带(Up the Strip)

向上跳带(Up the Strip)

题目描述

请注意,本题内存限制比通常题目更低。

有一条竖直的长条,共有 nn 个格子,从上到下编号为 11 到 nn。一个棋子初始位于格子 nn,你需要通过若干次移动让它到达格子 11。

当棋子位于某个格子 x>1x>1 时,一次移动可以是下面两种之一:

  • 减法移动:选择一个整数 yy,满足 1≤y≤x−11\le y\le x-1,把棋子从 xx 移动到 x−yx-y;
  • 下取整除法移动:选择一个整数 zz,满足 2≤z≤x2\le z\le x,把棋子从 xx 移动到 ⌊xz⌋\left\lfloor\dfrac{x}{z}\right\rfloor。

请计算用一次或多次移动从格子 nn 到达格子 11 的方案数,并对 mm 取模。如果一次移动中有多种不同选择能到达同一个格子,这些选择也视为不同方案。

输入格式

一行两个整数 n,mn,m,分别表示长条长度和模数。

输出格式

输出一个整数,表示从格子 nn 到格子 11 的方案数,对 mm 取模。

样例

3 998244353
5
5 998244353
25
42 998244353
793019428
787788 100000007
94810539

说明

第一个样例中,从格子 33 一步到达格子 11 有 33 种:减去 y=2y=2,或者除以 z=2z=2,或者除以 z=3z=3。

另外还有 22 种经过格子 22 的方案:先减去 y=1y=1,再减去 y=1y=1 或除以 z=2z=2。

因此总方案数为 55。

数据范围

2≤n≤4×1062\le n\le4\times10^6,108<m<10910^8<m<10^9,且 mm 是质数。