Written with StackEdit.

Description

方伯伯有一天去参加一个商场举办的游戏。商场派了一些工作人员排成一行。每个人面前有几堆石子。说来也巧,位置在 \(i\) 的人面前的第\(j\) 堆的石子的数量,刚好是 \(i\) 写成 \(K\) 进制后的第 \(j\) 位。

现在方伯伯要玩一个游戏,商场会给方伯伯两个整数\(L,R\)。方伯伯要把位置在 \([L, R]\)中的每个人的石子都合并成一堆石子。每次操作,他可以选择一个人面前的两堆石子,将其中的一堆中的某些石子移动到另一堆,代价是移动的石子数量 * 移动的距离。商场承诺,方伯伯只要完成任务,就给他一些椰子,代价越小,给他的椰子越多。所以方伯伯很着急,想请你告诉他最少的代价是多少。

例如:10 进制下的位置在 12312 的人,合并石子的最少代价为:

\(1 * 2 + 2 * 1 + 3 * 0 + 1 * 1 + 2 * 2 = 9\)

即把所有的石子都合并在第三堆.

Input

输入仅有 1 行,包含 3 个用空格分隔的整数 \(L,R,K\),表示商场给方伯伯的 2 个整数,以及进制数.

Output

输出仅有 1 行,包含 1 个整数,表示最少的代价.

Sample Input

3 8 3

Sample Output

5

Hint

\(1 < = L < = R < = 10^{15}, 2 < = K < = 20\)

Solution

  • 考虑数位dp计算出\([1,R]\)的答案,再减去\([1,L-1]\)的答案.
  • 一开始可以无脑将集结点设置在第1位,用一次数位dp计算出.(dfs1)
  • 然后考虑调整集结点.将集结点从\(i\)调整至\(i+1\)对答案造成的影响再用\(O(k)\)次数位dp计算出.(dfs2)
  • 在dfs2中注意若贡献小于0,应返回0,即不执行集结点的调整.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
{
fh=-1;
jp=getchar();
}
while (jp>='0'&&jp<='9')
{
out=out*10+jp-'0';
jp=getchar();
}
return out*fh;
}
ll k;
const int MAXN=100;
int t[MAXN],n;
ll f[MAXN][3010];
ll dfs1(int pos,int st,int lim)//数位dp,填到了第pos位,当前总和为st.
{
if(pos==0)
return st;
if(lim==0 && f[pos][st]!=-1)
return f[pos][st];
int mx=lim?t[pos]:k-1;
ll ans=0;
for(int i=0;i<=mx;++i)
ans+=dfs1(pos-1,st+i*(pos-1),lim && i==mx);
if(lim==0)
f[pos][st]=ans;
return ans;
}
ll dfs2(int pos,int st,int m,int lim)//将集结点调节为m的情况下计算最优答案
{
if(st<0)
return 0;
if(pos==0)
return st;
if(lim==0 && f[pos][st]!=-1)
return f[pos][st];
int mx=lim?t[pos]:k-1;
ll ans=0;
for(int i=0;i<=mx;++i)
{
if(pos>=m)
ans+=dfs2(pos-1,st+i,m,lim && i==mx);
else
ans+=dfs2(pos-1,st-i,m,lim && i==mx);
}
if(lim==0)
f[pos][st]=ans;
return ans;
}
ll solve(ll x)
{
for(n=0;x;x/=k)
t[++n]=x%k;
memset(f,-1,sizeof f);
ll res=dfs1(n,0,1);
for(int i=2;i<=n;++i)//将集结点从i-1调整至i,更新答案.
{
memset(f,-1,sizeof f);
res-=dfs2(n,0,i,1);
}
return res;
}
int main()
{
ll l=read(),r=read();
k=read();
ll ans=solve(r)-solve(l-1);
printf("%lld\n",ans);
return 0;
}

代码参考了dalao的blog.

bzoj 3598 方伯伯的商场之旅的更多相关文章

  1. [BZOJ3598][SCOI2014]方伯伯的商场之旅(数位DP,记忆化搜索)

    3598: [Scoi2014]方伯伯的商场之旅 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 449  Solved: 254[Submit][Sta ...

  2. 「SCOI2014」方伯伯的商场之旅 解题报告

    「SCOI2014」方伯伯的商场之旅 我一开始的想法会被两个相同的集合位置去重给搞死,不过应该还是可以写的,讨论起来老麻烦. 可以先钦定在\(1\)号点集合,然后往后调整一部分. 具体一点,通过前缀和 ...

  3. 「SCOI2014」方伯伯的商场之旅

    「SCOI2014」方伯伯的商场之旅 题目描述 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石 ...

  4. 洛谷P3286 [SCOI2014]方伯伯的商场之旅

    题目:洛谷P3286 [SCOI2014]方伯伯的商场之旅 思路 数位DP dalao说这是数位dp水题,果然是我太菜了... 自己是不可能想出来的.这道题在讲课时作为例题,大概听懂了思路,简单复述一 ...

  5. 【bzoj3598】: [Scoi2014]方伯伯的商场之旅

    Description 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 i 的人面前的第 j 堆的石子的数量,刚好是 i 写成 K 进制后的 ...

  6. [SCOI2014]方伯伯的商场之旅

    Description 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 i 的人面前的第 j 堆的石子的数量,刚好是 i 写成 K 进制后的 ...

  7. 【数位DP】SCOI2014 方伯伯的商场之旅

    题目内容 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子. 说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石子的数量,刚好是 \(i\) 写成 ...

  8. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  9. bzoj 3598 [Scoi2014]方伯伯的商场之旅——数位dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 TJ:https://www.cnblogs.com/Zinn/p/9351218.h ...

随机推荐

  1. SSDB系列文章推荐

    1. 下载和安装: http://ssdb.io/docs/zh_cn/install.html 2. SSDB 文档     http://ssdb.io/docs/zh_cn/index.html ...

  2. 【Java Web】新手教程(转)

    转自:http://www.journaldev.com/1854/java-web-application-tutorial-for-beginners#web-server-client Web ...

  3. 2018-2019-2 20165114《网络对抗技术》Exp2 后门原理与实践

    目录 一.实验准备 二.实验内容 三.基础问题回答 四.实验过程及步骤 五.实验总结与体会 六.实验中遇到的问题与错误. 一.实验准备 1.后门概念 后门就是不经过正常认证流程而访问系统的通道. 哪里 ...

  4. C++/VC中ANSI与UNICODE中字符定义和函数对照表

    这样查起来方便多了 ANSI UNICODE 通用 说明 数据类型 (char.h) (wchar.h) (tchar.h)   char wchar_t TCHAR   char * wchar_t ...

  5. QT中没有byte

    QT里没有没有byte数据类型的 自己定义:#define byte unsigned char

  6. [TJOI2010]打扫房间

    题目描述 学校新建了一批宿舍,值日生小A要把所有的空房间都打扫一遍.这些宿舍的布局很奇怪,整个建筑物里所有的房间组成一个N * M的矩阵,每个房间的东南西北四面墙上都有一个门通向隔壁房间.另外有些房间 ...

  7. Python基础笔记系列五:元组

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 元组 1)元组的结构和访问.使用方法和列表基本一致,区别主要有两点:1.使 ...

  8. Listview_简单使用_(Virtual)

    1.代码来自于“C:\Program Files (x86)\Borland\Delphi7\Demos\Virtual Listview” 1.1.是使用 ListView来显示数据 1.2.自己管 ...

  9. U盘安装OS

    1. 老毛桃 2. 大白菜 3.

  10. centOS7.4 thinkPHP nginx 支持pathinfo和rewrite

    server { listen 80; server_name www.demo.com mayifanx.com; root /data/www/demo; index index.php inde ...