将
k
k
k种饼干放入
x
x
x个袋子之中,使得每一个袋子的饼干价值相同,求有多少种不同的价值能够满足。
第
i
i
i个饼干有
a
i
a_i
ai个,价值为
2
i
−
1
2^{i-1}
2i−1.
k
≤
60
,
∑
a
i
≤
1
e
18
k\le60,\sum a_i\le1e18
k≤60,∑ai≤1e18
Solution
很容易想到,贪心放饼干,从高位往低位放,尽量把大的饼干塞入袋子里面,这样一定不劣。
于是就有了一个简单的DP思路,设
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示放到第
i
i
i位,当前小于
i
i
i的剩下的饼干的和为
j
j
j。
转移的状态数乍一看感觉很多,实际上仔细观察一下:
f
[
i
]
[
j
]
→
f
[
i
−
1
]
[
m
i
n
(
j
−
x
2
i
−
1
,
s
i
−
2
,
2
i
−
1
−
1
)
]
f[i][j]\to f[i-1][min(j-x2^{i-1},s_{i-2},2^{i-1}-1)]
f[i][j]→f[i−1][min(j−x2i−1,si−2,2i−1−1)]
f
[
i
]
[
j
]
→
f
[
i
−
1
]
[
m
i
n
(
j
,
s
i
−
2
,
2
i
−
1
−
1
)
]
f[i][j]\to f[i-1][min(j,s_{i-2},2^{i-1}-1)]
f[i][j]→f[i−1][min(j,si−2,2i−1−1)]
这种转移的状态实际上是有限的 ,理解上并不太直观。
或者可以考虑另一种方法:
如何判定一个
y
y
y是否满足条件,从低位往高位做,容易得到
[
s
u
m
i
−
1
x
]
≥
y
%
2
i
+
1
[\frac{sum_{i-1}}{x}]\ge y\%\ 2^{i+1}
[xsumi−1]≥y%2i+1
那么假设
l
i
m
i
=
[
s
u
m
i
−
1
x
]
lim_i=[\frac{sum_{i-1}}{x}]
limi=[xsumi−1],从高位往低位考虑
y
y
y的取值,如果当前第
i
i
i位
y
y
y与
l
i
m
lim
lim相同,那么继续递归下去,否则
y
<
l
i
m
y<lim
y<lim,那么限制就转化为了只有
i
−
1
i-1
i−1的限制,直接从
f
i
−
1
f_{i-1}
fi−1转移过来,因此只有
k
2
k^2
k2种状态。