constexprintqpow(int bs, int64_t idx = kMod - 2){ int ret = 1; for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod) if (idx & 1) ret = (int64_t)ret * bs % kMod; return ret; }
inlineintadd(int x, int y){ return (x + y >= kMod ? x + y - kMod : x + y); } inlineintsub(int x, int y){ return (x >= y ? x - y : x - y + kMod); } inlinevoidinc(int &x, int y){ (x += y) >= kMod ? x -= kMod : x; } inlinevoiddec(int &x, int y){ (x -= y) < 0 ? x += kMod : x; }
voidsolve1(){ staticint sum[kMaxN]; f[0] = 1; for (int i = 1; i <= b; ++i) { for (int j = 0; j <= n; ++j) { sum[j] = add(f[j], (j < i) ? 0 : sum[j - i]); int p = j - i * (i + 1); f[j] = sub(sum[j], (p < 0) ? 0 : sum[p]); } } }
voidsolve2(){ staticint f[kMaxB][kMaxN]; f[0][0] = 1; for (int i = 0; i <= n / b; ++i) { for (int j = 0; j <= n; ++j) { if (i && j + i <= n) inc(f[i][j + i], f[i][j]); if (j + b + 1 <= n) inc(f[i + 1][j + b + 1], f[i][j]); inc(g[j], f[i][j]); } } }
voiddickdreamer(){ std::cin >> n; b = sqrt(n); solve1(), solve2(); int ans = 0; for (int i = 0; i <= n; ++i) inc(ans, 1ll * f[i] * g[n - i] % kMod); std::cout << ans << '\n'; }