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
5hint
1<=l<=r<=1015,2<=k<=20
**://頭部分 已刪去
typedef
long
long ll;
using
namespace std;
const
int32_t maxn =
1e5+5;
int num[61]
;int k;
int maxbit =60;
ll dp1[61]
[1400];
ll dfs1
(int pos,
bool limit,
int cost,
int bas)if(
!limit &&
~dp1[pos]
[cost]
)return dp1[pos]
[cost]
; ll res =0;
int up = limit ? num[pos]
: k -1;
for(
int i =
0; i <= up; i++)if
(!limit)dp1[pos]
[cost]
= res;
return res;
}ll solve1
(ll x)
return
dfs1
(maxbit,
true,0
,0);
}ll dp[61]
[200];
ll dfs
(int pos,
bool limit,
int pre,
int suf,
int nowp)
// nowp -> nowp-1if(
!limit)dp[pos]
[delta +
100]
= res;
return res;
}ll solve
(ll x,
int pp)
return
dfs(maxbit,
true,0
,0, pp);}
signed
main()
ll ans =
solve1
(r)-
solve1
(l -1)
;for
(int i = maxbit; i >
1; i--
)println
(ans)
;return0;
}
方伯伯的商場之旅 SCOI2014
方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第 j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數 l,r 方伯伯要把位置在 l,r 中的每個人的石子都合併成一堆石...
SCOI2014 方伯伯的商場之旅
方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第 j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數 l,r。方伯伯要把位置在 l,r 中的每個人的石子都合併成一堆石...
SCOI2014 方伯伯的商場之旅
題目描述 方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第 j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數 l,r 方伯伯要把位置在 l,r 中的每個人的石子都合...