[gym101485]Debugging 记忆化+整除分块

/*
    [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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值