HDU 6036 Division Game(No Code)

HDU 6036 Division Game-Vjudge链接

题目大意

k k 堆石头,每一堆有 n n 个石子,以 n=mi1peii n = ∏ i − 1 m p i e i 给出(相当于就是把 n n 分解成质因数 pi p i 给你,还告诉你每个质因数的个数 ei e i ,每次从第 1 堆到第 k k 堆依次拿取石头(至少1个),要求拿完石头之后的数字为原本这堆石头个数的约数,当有任意一堆石头只有1个剩余时游戏结束

问:在第 i i 堆石头上结束游戏的方案数是多少?

简化题意

每次拿石头都只能使剩下的石头的个数为原本石头的约数,相当于就是从当前这堆石头的非1质因数中抽掉任意多个
所以说 每一堆石头最多能够操作 mi=1ei ∑ i = 1 m e i
把任意一堆的质因数全部抽掉则游戏结束

开始解题

于是我们就相当于把题目变成了 每堆石头有 S=mi=1ei S = ∑ i = 1 m e i 个,每次最少抽掉1个石头,当任意一堆石头没了,游戏就结束了

然后我们就能大胆地开始设式子了

f(i) f ( i ) 表示第 i i 轮操作取完当前这堆石子的方案数

g(i) g ( i ) 表示第 i1 i − 1 轮操作取不完当前这堆石子的方案数

那么就有 ansi=k<=Sk=1gi1(k+1)f(k)gni(k) a n s i = ∑ k = 1 k <= S g i − 1 ( k + 1 ) ∗ f ( k ) ∗ g n − i ( k )
解释一下
枚举在第 k k 轮把第 i i 堆取完,最多进行 S S
i1 i − 1 堆在 k k 轮之后仍然取不完 每一堆方案为 g(k+1) g ( k + 1 ) ,共 i1 i − 1 堆,故为 gi1(k+1) g i − 1 ( k + 1 )
i i 堆在第 k k 轮取完 故为 f(k) f ( k )
ni n − i 堆被取了 k1 k − 1 轮 每一堆方案为 g(k) g ( k ) ,共 ni n − i 堆,故为 gni(k) g n − i ( k )
故以上为最后的结果

考虑上述 f(i) f ( i ) g(i) g ( i ) 之间的转化关系
i i 轮取完的当前石子的方案为 在第 i1 i − 1 轮取不完的同时,第 i i 轮直接全部取完
g(i) g ( i ) 中的每一种方案对应且仅对应一种在 i i 轮取完所有石子的方案
因此 f(i)=g(i)1=g(i) f ( i ) = g ( i ) ∗ 1 = g ( i )

化简后的式子为 ansi=k<=Sk=1fi1(k+1)fni+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 个
因此我们需要添加 k1 k − 1 个石头 此时隔板法才合法
否则当石头个数为 0 时,两个隔板重合,隔法不合法

就是这种情况
·|·||·
当中有两个隔板隔到一起,不合法,就要强行加一个石子进去

因此对于第 i i 种石头,它被分配的方案数为 Ck1ei+k1 C e i + k − 1 k − 1
对于全部 m m 种石头,分配方案就是 mi=1Ck1ei+k1 ∏ i = 1 m C e i + k − 1 k − 1

但是对于这种分配,会出现真的某一轮没抽石子的情况
此时我们就要搞出一个很神奇的容斥(此处真的真的没理解到=_=)

f(x)=y=1xCyx(1)xyi=1yCk1ei+k1 f ( x ) = ∑ y = 1 x C x y ( − 1 ) x − y ∏ i = 1 y C e i + k − 1 k − 1


i=1yCk1ei+k1=h(y) ∏ i = 1 y C e i + k − 1 k − 1 = h ( y )


f(x)=y=1xCyx(1)xyh(y)=y=1xx!(1)xyy!(xy)!h(y) f ( x ) = ∑ y = 1 x C x y ( − 1 ) x − y h ( y ) = ∑ y = 1 x x ! ( − 1 ) x − y y ! ( x − y ) ! h ( y )

f(x)x!=y=1x(1)xy(xy)!h(y)y! f ( x ) x ! = ∑ y = 1 x ( − 1 ) x − y ( x − y ) ! h ( y ) y !

就成卷积形式了=_=
更神奇的是 模数满足 NTT N T T
于是就愉快地用 NTT N T T 加速

没有代码 等我过了再说吧

你可能感兴趣的:(FFT/NTT,数论)