我们考虑从 Ferrers diagram 的原点引出一条 的直线,它离开这个图的位置就框处了一个 的正方形,这个正方形被称为一个整数拆分的 Durfee square。那么如果我们确认了正方形的边长是 ,它两侧放置的就都是 的整数划分。因此我们得到了整数划分的这样一个表达式:
在计算前 项时,由于 ,我们只需要完成前 项的 即可。
因此我们只需要这几行核心代码即可完成计算,复杂度为 :
int b = sqrt(n);
ans[0] = tmp[0] = 1;
for (int i = 1; i <= b; ++i) {
for (int rep = 0; rep < 2; ++rep)
for (int j = i; j <= n - i * i; ++j)
add(tmp[j], tmp[j - i]);
for (int j = i * i; j <= n; ++j)
add(ans[j], tmp[j - i * i]);
}