题意差评,其实就是一个递推式:(f_1 = 1 , f_i = sumlimits_{j=2}^i f_{lfloor frac{i}{j} floor}),然后求(f_N)的值
首先(lfloor frac{i}{j} floor)只有(2sqrt{i})种取值,这意味着每一次计算的关联量并不多
而每一次只需要求一组数据的解,于是大力记忆化搜索一下就可以AC了
PS:在Luogu AC此题有263分大礼包QAQ
#include<bits/stdc++.h>
#include<unordered_map>
#define ll long long
//This code is written by Itst
using namespace std;
unordered_map < int , ll > ans;
ll solve(int x){
if(x == 1) return 1;
if(ans.find(x) != ans.end()) return ans[x];
ll sum = 0;
for(int i = 2 , pi ; i <= x ; i = pi + 1){
pi = x / (x / i);
sum += solve(x / i) * (pi - i + 1);
}
return ans[x] = sum;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
int N;
cin >> N;
cout << solve(N);
return 0;
}