题解 P4808 【[CCC 2018]平衡树】
可以列出如下递归式 :
对于
技巧 : 把整除分块的结果映射到连续数列上。设结果为
状态数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 400010;
ll f[M];
int n, sqn;
inline int toId(int x) {
return x <= sqn ? x : n / x + sqn;
}
ll solve(int n) {
int fid = toId(n);
if(~f[fid]) return f[fid];
if(n == 1) return 1;
ll ans = 0;
int r = 0;
for(int k = 2; k <= n; k = r + 1) {
r = n / (n / k);
ans += r >= k ? (r - k + 1) * solve(n / k) : 0;
}
return f[fid] = ans;
}
int main() {
memset(f, -1, sizeof(f));
cin >> n;
sqn = sqrt(n);
cout <<solve(n) << endl;
return 0;
}