思路:因为对于均等划分来说,有两种情况,一是完全化成等分,二是一部分等分 + 一块小一点的,而对于后者来说,小一点的那块越大越好,也就联想到了用数论分块来求解。然后直接搜就行,但是存在最优子结构,所以需要加上记忆化搜索=_=,场上想到分块了,但是感觉不加记忆化搜索不会T结果T了,然后因时间紧,没来的及加记忆化,虽然改成记忆化也挺简单的。。。。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
ll n, s, p;
ll d[maxn];
ll dfs(ll now) {
if(now <= 1) return 0;
if(~d[now]) return d[now];
d[now] = 1e17;
for(ll l = 1, r = 0; l <= now; l = r + 1) {
r = now / (now / l);
if(now % l != 0) {
d[now] = min(d[now], dfs(l) + (now / l) * p + s);
}
if(now % r == 0) {
d[now] = min(d[now], dfs(r) + (now / r - 1) * p + s);
}
}
return d[now];
}
int main()
{
// freopen("i.txt", "r", stdin);
scanf("%lld%lld%lld", &n, &s, &p);
memset(d, -1, sizeof(d));
printf("%lld\n", dfs(n));
return 0;
}