long long dp[MAXN], sum[MAXN];
inline int solve(int n) {
memset(dp, 0, sizeof(dp));
memset(sum, 0, sizeof(sum));
dp[0] = dp[1] = 1;
sum[0] = sum[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = 1 + sum[i / 2];
sum[i] = dp[i] + sum[i - 1];
}
return dp[n];
}
解析:由题目显然可知每个数能获得的正整数的个数是自己和所有的1到x/2的数所组成之和,记录每位能组成的个数和维护一个前缀和即可
Tips: n取2021时数据显然超过int的范围,需要使用long long
时间复杂度:O(n)