版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40307434/article/details/83210486
/*
[gym101485]Debugging 记忆化+整除分块 by zhuhua
AC time: 31ms
n行代码,跑一遍Rs,加一行输出Ps,问找出崩溃位置的最坏最短时间。
n行代码 -> n-1个空格开始填空找位置 —> 算插空位置不用讨论情况
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int nmax=1e6+100;
ll dp[nmax];
const ll inf=1e15;
ll dfs(ll n,ll R,ll P){
if(n<=0) return 0;
if(dp[n]) return dp[n];
dp[n]=n*P+R;
for(int l=2,r;l<=n;l=r+1){
//每组l-r个,组数均为n/l
r=n/(n/l);
/*
空格要填上n/l个,无论是除的尽除不尽。
8对于l=3:00100100
r=4:00010001
要填的空格数=组数 8/3=8/4
*/
ll tt=dfs(l-1,R,P)+R+(n/l)*P;
dp[n]=min(dp[n],tt);
}
return dp[n];
}
int main(){
ll n,r,p;
scanf("%I64d%I64d%I64d",&n,&r,&p);
printf("%I64d\n",dfs(n-1,r,p));
return 0;
}