CF1558B.Up the Strip
普及/提高-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
Note that the memory limit in this problem is lower than in others.
You have a vertical strip with n cells, numbered consecutively from 1 to n from top to bottom.
You also have a token that is initially placed in cell n . You will move the token up until it arrives at cell 1 .
Let the token be in cell x>1 at some moment. One shift of the token can have either of the following kinds:
- Subtraction: you choose an integer y between 1 and x−1 , inclusive, and move the token from cell x to cell x−y .
- Floored division: you choose an integer z between 2 and x , inclusive, and move the token from cell x to cell ⌊zx⌋ ( x divided by z rounded down).
Find the number of ways to move the token from cell n to cell 1 using one or more shifts, and print it modulo m . Note that if there are several ways to move the token from one cell to another in one shift, all these ways are considered distinct (check example explanation for a better understanding).
输入格式
The only line contains two integers n and m ( 2≤n≤4⋅106 ; 108<m<109 ; m is a prime number) — the length of the strip and the modulo.
输出格式
Print the number of ways to move the token from cell n to cell 1 , modulo m .
输入输出样例
输入#1
3 998244353
输出#1
5
输入#2
5 998244353
输出#2
25
输入#3
42 998244353
输出#3
793019428
输入#4
787788 100000007
输出#4
94810539
说明/提示
In the first test, there are three ways to move the token from cell 3 to cell 1 in one shift: using subtraction of y=2 , or using division by z=2 or z=3 .
There are also two ways to move the token from cell 3 to cell 1 via cell 2 : first subtract y=1 , and then either subtract y=1 again or divide by z=2 .
Therefore, there are five ways in total.