拆分数
可以 \(O(n \sqrt n)\) 计算。
int p[M] = {0}, tmp[M] = {0};//分拆数
void init(int n) {//算出所有小于等于 n 的分拆数
int b = sqrt(n);
p[0] = tmp[0] = 1;
for (int i = 1; i <= b; i++) {
for (int t = 1; t <= 2; t++)
for (int j = i; j <= n - i * i; j++)
add(tmp[j], tmp[j - i]);
for (int j = i * i; j <= n; j++)
add(p[j], tmp[j - i * i]);
}
}