HDU 6036 Division Game-Vjudge链接
题目大意
有 k k 堆石头,每一堆有 个石子,以 n=∏mi−1peii n = ∏ i − 1 m p i e i 给出(相当于就是把 n n 分解成质因数 给你,还告诉你每个质因数的个数 ei e i ,每次从第 1 堆到第 k k 堆依次拿取石头(至少1个),要求拿完石头之后的数字为原本这堆石头个数的约数,当有任意一堆石头只有1个剩余时游戏结束
问:在第 堆石头上结束游戏的方案数是多少?
简化题意
每次拿石头都只能使剩下的石头的个数为原本石头的约数,相当于就是从当前这堆石头的非1质因数中抽掉任意多个
所以说 每一堆石头最多能够操作
∑mi=1ei
∑
i
=
1
m
e
i
次
把任意一堆的质因数全部抽掉则游戏结束
开始解题
于是我们就相当于把题目变成了 每堆石头有 S=∑mi=1ei S = ∑ i = 1 m e i 个,每次最少抽掉1个石头,当任意一堆石头没了,游戏就结束了
然后我们就能大胆地开始设式子了
设
f(i)
f
(
i
)
表示第
i
i
轮操作取完当前这堆石子的方案数
表示第
i−1
i
−
1
轮操作取不完当前这堆石子的方案数
那么就有
ansi=∑k<=Sk=1gi−1(k+1)∗f(k)∗gn−i(k)
a
n
s
i
=
∑
k
=
1
k
<=
S
g
i
−
1
(
k
+
1
)
∗
f
(
k
)
∗
g
n
−
i
(
k
)
解释一下
枚举在第
k
k
轮把第 堆取完,最多进行
S
S
轮
前 堆在
k
k
轮之后仍然取不完 每一堆方案为 ,共
i−1
i
−
1
堆,故为
gi−1(k+1)
g
i
−
1
(
k
+
1
)
第
i
i
堆在第 轮取完 故为
f(k)
f
(
k
)
后
n−i
n
−
i
堆被取了
k−1
k
−
1
轮 每一堆方案为
g(k)
g
(
k
)
,共
n−i
n
−
i
堆,故为
gn−i(k)
g
n
−
i
(
k
)
故以上为最后的结果
考虑上述
f(i)
f
(
i
)
与
g(i)
g
(
i
)
之间的转化关系
第
i
i
轮取完的当前石子的方案为 在第 轮取不完的同时,第
i
i
轮直接全部取完
故 中的每一种方案对应且仅对应一种在
i
i
轮取完所有石子的方案
因此
化简后的式子为 ansi=∑k<=Sk=1fi−1(k+1)∗fn−i+1(k) a n s i = ∑ k = 1 k <= S f i − 1 ( k + 1 ) ∗ f n − i + 1 ( k )
开始处理 f(i) f ( i )
此时由于两个方案之间必须有不同,所以我们就必须把相同的质因数当成相同的石子
也就是说
ei
e
i
代表的是有
ei
e
i
个石子是相同的
这个时候就会出现重复的情况
同时石子的顺序不同最后的结果也会不同
因此我们把每一堆石子分开讨论
对于每一堆石子 我们把
ei
e
i
个相同的石头分配到
k
k
轮操作当中过去
值得注意的是 当前这一轮抽掉这一种石头可能为 0 个
因此我们需要添加 个石头 此时隔板法才合法
否则当石头个数为 0 时,两个隔板重合,隔法不合法
就是这种情况
·|·||·
当中有两个隔板隔到一起,不合法,就要强行加一个石子进去
因此对于第
i
i
种石头,它被分配的方案数为
对于全部
m
m
种石头,分配方案就是
但是对于这种分配,会出现真的某一轮没抽石子的情况
此时我们就要搞出一个很神奇的容斥(此处真的真的没理解到=_=)
令
则
就成卷积形式了=_=
更神奇的是 模数满足 NTT N T T
于是就愉快地用 NTT N T T 加速