一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
1561D1 - Up the Strip (simplified version)
二、解题报告
1、思路分析
一眼dp
写出dp方程:
前者维护前缀和即可O(1)转移
后者呢?——整除分块数论分块问题-CSDN博客
简单叙述下原理,详细的看上面链接
[n / i]的取值只有根号n种,每种取值有一个左右边界[l, r], l = i, r = n / (n / l)
这样我们的dp就能转移
这只能过掉D1,D2 1e6量级就不能这么做了,不过D2就是另一个解法了
2、复杂度
时间复杂度: 空间复杂度:O(N)
3、代码详解
n, m = map(int, input().split())
f = [0] * (n + 1)
f[1] = 1
pre = 1
for i in range(2, n + 1):
f[i] = pre
l = 2
while l <= i:
r = i // (i // l) + 1
f[i] = (f[i] + f[i // l] * (r - l)) % m
l = r
pre = (pre + f[i]) % m
print(f[n])